我有一个Java ExecutorService(固定线程池为1),我将可运行的任务传递给将来执行。每项任务通常在10秒内完成。 ExecutorService只是简单地完成任务。如果我关闭了我的应用程序,请执行以下操作;
if (taskProcessor != null) {
taskProcessor.shutdownNow();
while (!taskProcessor.isTerminated()) {
// Wait For All Submitted Tasks To Finish
}
}
问题是它似乎需要一段时间才能关闭,有时它可能需要几分钟,有时似乎永远不会关闭,有时它会在几秒钟内关闭!在执行程序队列中的任何时候都可能有大约2000个任务,但我只是希望它完成它正在执行的当前任务并退出。我在这里做错了什么?
答案 0 :(得分:0)
这一切都取决于正在执行的任务。在所有任务结束之前,ThreadPoolExecutor不会结束。 shutdownNow()会中断所有任务,但任务可能会忽略它。
答案 1 :(得分:0)
您没有按照正确的顺序关闭ExecutorService
。
您必须按oracle
的建议按特定顺序致电shutdown
,shutdownNow
和awaitTermination
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
答案 2 :(得分:0)
您可以通过不让代码忙于等待来做得更好。这将释放CPU以完成任务。并防止争用isTerminated使用的任何锁。