我有大约900个任务。我已将线程池计数设置为50。我正在运行一个循环,并将每个任务提交给executorService。
一旦控制出来,我就把关机称为
for (Entry<String, String> CurrentJob : Tasks.entrySet()) {
m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey()));
}
m_service.shutdown();
每项任务平均耗时约1秒。现在我有两个问题
a) 他们几乎都在做这项工作(850人),但大约有50人失踪。我已经将调试器设置为可调用,但对于那个些特定的任务,控制甚至并没有出现。尽管如果我把它们单独放在一起,它们是有效的。我缺少执行器服务的什么逻辑?
b) 我在这段代码周围放了一个计时器,根据javaDoc Shutdown应该等到所有线程都完成,但我的计时器总是说时间为零。
ExecutiorService不会等待先前提交的任务完成。来自JavaDocs:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--
此方法不等待以前提交的任务完成执行。使用awaitTermination来完成此操作。
那么,可能发生的情况是ExecutorService关闭,继续完成排队的工作,但JVM退出是因为您的主线程终止(只留下守护程序线程,这将无法保持JVM的活动)?也许这就是问题所在?
为了处理被执行器拒绝的任务,服务ThreadPoolExecutitor提供了RejectedHandler类。
示例ThreadPoolExecutitor threadP=(ThreadPoolExecutior)Executitors.newFixedThreadPool(3);threadP.setRejectedExecutionHandler(new RejectedHandler());//添加任务
threadP.shutdown()