如何中断ExecutorService的线程

新手上路,请多包涵

使用 ExecutorService 返回的 Executors.newSingleThreadExecutor() 时,如何中断它?

原文由 Ofek Ron 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 785
2 个回答

为此,您需要将 submit() 任务交给 ExecutorService ,而不是调用 execute() 。执行此操作时,将返回一个 Future 可用于操作计划任务。特别是,您可以在关联的 cancel(true) Future 来中断当前正在执行的任务(如果任务尚未开始运行,则完全跳过执行)。

顺便说一句, Executors.newSingleThreadExecutor() 返回的对象实际上是一个 ExecutorService

原文由 erickson 发布,翻译遵循 CC BY-SA 3.0 许可协议

中断执行程序的内部管理线程的另一种方法是在您的 ExecutorService 上调用 shutdownNow(..) 方法。但是请注意,与@erickson 的解决方案相反,这将导致整个 ThreadPoolExecutor 变得不适合进一步使用。

我发现这种方法在不再需要 ExecutorService 并且不再需要关注 Future 实例的情况下特别有用(一个典型的例子是 exit(..) 你的申请方法)。

来自 ExecutorService#shutdownNow(..) javadocs的相关信息:

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

除了尽最大努力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt 取消,因此任何未能响应中断的任务可能永远不会终止。

原文由 Priidu Neemre 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题