【问题标题】:Best way to stop a ScheduledThreadPoolExecutor停止 ScheduledThreadPoolExecutor 的最佳方法
【发布时间】:2019-11-15 05:02:26
【问题描述】:

我正在使用单个 ScheduledThreadPoolExecutor 来管理多个任务,并希望添加停止它们的选项。
我了解常规执行程序服务上的 shutdown 和 shutdownNow 之间的区别,并且有兴趣了解它将如何影响 ScheduledThreadPoolExecutor 中的任务 - 其中任务也计划定期运行。
给定一个正在运行的ScheduledThreadPoolExecutor,它同时具有正在运行的任务、计划在将来运行的一次任务以及计划以恒定间隔(每 X 分钟一次)运行的任务。 实现以下“命令”的最佳方式是什么:

  1. 现在停止一切。立即停止所有正在运行的任务,不要运行任何已安排但尚未开始的任务。
  2. 如果需要,可以完成当前运行的线程。不要运行任何已安排但尚未开始的任务。

【问题讨论】:

    标签: java multithreading scheduled-tasks threadpool threadpoolexecutor


    【解决方案1】:
    1. 现在停止一切。立即停止所有正在运行的任务,不要运行任何已安排但尚未开始的任务。

    你可以使用方法:public List<Runnable> shutdownNow(),但是 请注意,当前正在执行的线程可能不会立即执行 终止。如果你想这样做,那么你必须找到一种方法 通过单独的线程或其他方式发出终止进程的信号。

    来自 Javadocs: 除了尽力而为之外,没有任何保证 停止处理正在执行的任务。这个实现 通过 Thread.interrupt() 取消任务,因此任何失败的任务 响应中断可能永远不会终止。

    1. 如果需要,可以完成当前运行的线程。不要运行任何已安排但尚未开始的任务。

    这可以通过使用方法来实现:public void shutdown()

    来自 Javadocs: 如果已设置 ExecuteExistingDelayedTasksAfterShutdownPolicy false,延迟尚未过去的现有延迟任务是 取消。除非 ContinueExistingPeriodicTasksAfterShutdownPolicy 已设置为 true, 现有周期性任务的未来执行将被取消。

    【讨论】:

      【解决方案2】:

      您可以使用

      进行配置

      所以你的两种情况是

      1. 致电shutdownNow
      2. 将 continue 策略设置为 false,然后调用 shutdown

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2020-12-06
        相关资源
        最近更新 更多