执行器服务缺少一些任务

我有大约900个任务。 我已将threadpool count设置为50.我正在运行一个循环并将每个任务提交给executorService。

一旦控制出现,我会按照如下所述调用shutdown

for (Entry<String, String> CurrentJob : Tasks.entrySet()) {
            m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey()));
        }
          m_service.shutdown();

每个任务的平均时间大约为1秒。现在我有两个问题

a)几乎所有人都在做这项工作(850),但大约有50人失去了。 我已经把调试器放在可调用的位置,但是对于那些特定的任务来说,控制甚至没有到达那里。 虽然如果我将它们单独放入工作。 我缺少什么Executor服务逻辑?

b)我已经为此代码添加了一个计时器,并根据javaDoc关机应等到所有线程完成但我的计时器始终表示时间为零。


ExecutorService不会等待先前提交的任务完成。 从JavaDocs:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--

此方法不会等待先前提交的任务完成执行。 使用awaitTermination来做到这一点。

所以可能发生的事情是ExecutorService关闭,继续完成排队的工作,但JVM因为主线程终止而退出(只留下守护程序线程,这不会让JVM保持活动状态)? 也许这就是问题所在?


通过执行程序服务处理拒绝的任务ThreadPoolExecutor提供RejectedHandler类。

示例 ThreadPoolExecutor threadP =(ThreadPoolExecutor)Executors.newFixedThreadPool(3); threadP.setRejectedExecutionHandler(new RejectedHandler()); //添加任务

threadP.shutdown()

链接地址: http://www.djcxy.com/p/50187.html

上一篇: Executor service missing few tasks

下一篇: ExecutorService.invokeAll and shutdown