我有一个Java ExecutorService(固定线程池为1),我将可运行的任务传递给将来执行 . 每项任务通常在10秒内完成 . ExecutorService只是简单地完成任务 . 如果我关闭我的应用程序,我运行以下;
if (taskProcessor != null) {
taskProcessor.shutdownNow();
while (!taskProcessor.isTerminated()) {
// Wait For All Submitted Tasks To Finish
}
}
问题是它似乎需要一个年龄才能关闭,有时它可能需要几分钟,有时它似乎永远不会关闭,有时它会在几秒钟内关闭!执行程序队列中的任何时候都可能有大约2000个任务,但我只是希望它完成当前正在执行的任务并退出 . 我在这做错了什么?
3 回答
您没有按照正确的顺序关闭
ExecutorService
.您必须按照oracle的建议按特定顺序调用
shutdown
,shutdownNow
和awaitTermination
这一切都取决于正在执行的任务 . ThreadPoolExecutor将不会结束,直到所有任务结束 . shutdownNow()会中断所有任务,但任务可能会忽略它 .
没有让代码忙着等待,你可以做得更好 . 这将释放CPU以完成任务 . 并防止争用isTerminated使用的任何锁 .