如何从 Java 中的 ScheduledExecutorService 执行所有挂起的计划任务

How to execute all pending scheduled tasks from a ScheduledExecutorService in Java

我正在使用 ScheduledExecutorService 在一段时间后将事件重新排队回消息队列。现在我需要在触发某些事件后执行此执行程序的所有计划的待处理任务。

我看到可以取消挂起的任务,但我需要 运行 在关闭执行程序之前取消所有这些任务。有没有办法做到这一点?或者我应该使用不同的策略来安排此任务。

Or should I use a different strategy to schedule this tasks.

是的,你应该使用另一种策略。

同样,ScheduledExecutorService 用于在 一定 时间过去后安排 运行 任务。如果不知道什么时候有任务

如果您想缓冲一些任务以在稍后 未确定 时间执行,请收集您的 Runnable or Callable objects as you would any other bunch of objects. Use a class from the Java Collections framework

如果您关心按特定顺序 运行 执行的任务,例如 LIFO or FIFO, use a Queue or Deque 实施。

当时间到达 运行 您的任务时,从 queue/deque 提供 Runnable/Callable 对象并提交给执行程序服务。

  • 如果您关心 任务 运行 连续 ,并且不及时重叠它们的执行,则使用 single-threaded 执行器服务。
    • ExecutorService es = Executors.newSingleThreadExecutor​() ;
  • 相反,如果您关心尽快完成一堆 任务,那么您可能想要使用由 thread pool. This assumes your deployment machine has multiple cores, and/or your your tasks are not CPU-bound 支持的执行程序服务(任务花费大量时间等待网络调用、reading/writing 存储驱动器、数据库查询等资源)。
    • ExecutorService es = Executors.newCachedThreadPool() ;
    • ExecutorService es = Executors.newFixedThreadPool​( 4 ) ;

强制性提示:阅读、重读和研究 Brian Goetz 等人的精彩著作 Java Concurrency in Practice

ExecutorService::shutdownNow

对象 ScheduledExecutorService 有一个方法:shutdownNow()。 它将return一个可以执行的List<Runnable>