停止ScheduledThreadPoolExecutor的最佳方法

时间:2019-07-04 12:40:59

标签: java multithreading scheduled-tasks threadpool threadpoolexecutor

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

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

2 个答案:

答案 0 :(得分:3)

  1. 立即停止一切。立即停止所有正在运行的任务,不要运行任何已安排但尚未启动的任务。
  

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

     

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

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

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

     

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

答案 1 :(得分:1)

您可以使用

进行配置

所以你的两种情况都是

  1. 致电shutdownNow
  2. 将继续策略设置为false,然后致电shutdown