【问题标题】:Best way to stop a ScheduledThreadPoolExecutor停止 ScheduledThreadPoolExecutor 的最佳方法
【发布时间】:2019-11-15 05:02:26
【问题描述】:
我正在使用单个 ScheduledThreadPoolExecutor 来管理多个任务,并希望添加停止它们的选项。
我了解常规执行程序服务上的 shutdown 和 shutdownNow 之间的区别,并且有兴趣了解它将如何影响 ScheduledThreadPoolExecutor 中的任务 - 其中任务也计划定期运行。
给定一个正在运行的ScheduledThreadPoolExecutor,它同时具有正在运行的任务、计划在将来运行的一次任务以及计划以恒定间隔(每 X 分钟一次)运行的任务。
实现以下“命令”的最佳方式是什么:
- 现在停止一切。立即停止所有正在运行的任务,不要运行任何已安排但尚未开始的任务。
- 如果需要,可以完成当前运行的线程。不要运行任何已安排但尚未开始的任务。
【问题讨论】:
标签:
java
multithreading
scheduled-tasks
threadpool
threadpoolexecutor
【解决方案1】:
- 现在停止一切。立即停止所有正在运行的任务,不要运行任何已安排但尚未开始的任务。
你可以使用方法:public List<Runnable> shutdownNow(),但是
请注意,当前正在执行的线程可能不会立即执行
终止。如果你想这样做,那么你必须找到一种方法
通过单独的线程或其他方式发出终止进程的信号。
来自 Javadocs: 除了尽力而为之外,没有任何保证
停止处理正在执行的任务。这个实现
通过 Thread.interrupt() 取消任务,因此任何失败的任务
响应中断可能永远不会终止。
- 如果需要,可以完成当前运行的线程。不要运行任何已安排但尚未开始的任务。
这可以通过使用方法来实现:public void shutdown()
来自 Javadocs:
如果已设置 ExecuteExistingDelayedTasksAfterShutdownPolicy
false,延迟尚未过去的现有延迟任务是
取消。除非
ContinueExistingPeriodicTasksAfterShutdownPolicy 已设置为 true,
现有周期性任务的未来执行将被取消。
【解决方案2】:
您可以使用
进行配置
所以你的两种情况是
- 致电
shutdownNow
- 将 continue 策略设置为 false,然后调用
shutdown