我的应用程序正在调用:
ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1);
// schedule some tasks
scheduler.shutdown();
if (!scheduler.awaitTermination(10, TimeUnit.SECONDS))
System.out.println("Boom!");
无论我做什么,我似乎都无法让awaitTermination()
返回true
。这尤其令人困惑,因为我可以看到(使用调试器)调度程序线程完全处于空闲状态。
使用scheduler.getQueue()
,我注意到在调用scheduler.shutdown()
之后,队列中仅剩下一个任务。任务状态为“未完成”,表示任务正在等待执行且未取消。
shutdown()
不取消此任务?awaitTermination()
返回true
?我了解shutdownNow()
,但我不想中断正在运行的任务。
答案 0 :(得分:0)
我知道了。
每https://bugs.openjdk.java.net/browse/JDK-7069418,队列中的所有任务都会阻止ScheduledThreadPoolExecutor
关闭。在某些情况下,它甚至说即使取消任务也可以防止关机,但对我而言并非如此。
我错误地认为shutdown()
将取消未处于活动状态的待处理任务。事实并非如此。
shutdownNow()
取消挂起的任务,但也会中断正在运行的任务(我不想这样做)。因此,如果您的目标是取消所有待处理的任务并等待正在运行的任务完成(而不会中断),则只需在ScheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false)
之前调用shutdown()
。