即使没有任务在运行,ScheduledExecutorService.awaitTermination()也返回false

时间:2018-09-06 08:13:00

标签: scheduledexecutorservice

我的应用程序正在调用:

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(),但我不想中断正在运行的任务。

1 个答案:

答案 0 :(得分:0)

我知道了。

https://bugs.openjdk.java.net/browse/JDK-7069418,队列中的所有任务都会阻止ScheduledThreadPoolExecutor关闭。在某些情况下,它甚至说即使取消任务也可以防止关机,但对我而言并非如此。

我错误地认为shutdown()将取消未处于活动状态的待处理任务。事实并非如此。

shutdownNow()取消挂起的任务,但也会中断正在运行的任务(我不想这样做)。因此,如果您的目标是取消所有待处理的任务并等待正在运行的任务完成(而不会中断),则只需在ScheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false)之前调用shutdown()