【问题标题】:ScheduledExecutorService.awaitTermination() returns false even though no tasks are running即使没有任务正在运行,ScheduledExecutorService.awaitTermination() 也会返回 false
【发布时间】:2018-09-06 08:12:59
【问题描述】:

我的应用程序正在调用:

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

【问题讨论】:

    标签: scheduledexecutorservice


    【解决方案1】:

    我想通了。

    根据https://bugs.openjdk.java.net/browse/JDK-7069418,队列中的任何任务都会阻止ScheduledThreadPoolExecutor 关闭。在某些情况下,它继续说即使取消的任务也可以防止关机,但对我来说不是这样。

    我错误地认为shutdown() 会取消未主动运行的待处理任务。事实并非如此。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2020-07-24
      • 2011-01-31
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多