执行器服务缺少一些任务
我有大约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