如何中断ExecutorService的线程

Ofe*_*Ron 30 java concurrency multithreading executorservice

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

eri*_*son 38

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

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

  • 为此,您不必手动确保线程是可中断的.并非所有线程都可以被中断. - 无论如何,我想. (2认同)
  • 是的,这描述了如何中断运行任务的线程.任务是否响应中断是另一个问题.这取决于任务正在做什么. (2认同)
  • `ExecutorService` 是否处理中断的线程?也就是说,如果由“ExecutorService”管理的“futures”之一被“future.cancel(true)”取消,则该线程中断标志将为 true。“ExecutorService”是否确保在该线程再次重新用于另一个任务之前重置该线程的中断标志? (2认同)

Pri*_*mre 6

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

我发现这种方法在ExecutorService不再需要的情况下特别有用,并且在其他Future情况下不需要在实例上保留制表符(这种情况的主要示例exit(..)是您的应用程序的方法)。

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

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

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