0

我有一个RunnableExecutor.
可运行对象被阻塞在SychronousQueue.take. 我怎样才能确保take我这样做时会被打断executor.shutdown

4

3 回答 3

2

+1 给@Eugene。 ExecutorService.shutdown()关闭线程池,但任何提交的作业将继续运行,直到完成。如果你改用shutdownNow()它,它实际上会中断线程。这并不意味着它们会立即停止,但它确实意味着如果它们被阻塞queue.take()或下一次调用queue.take()它会抛出一个InterruptedException这样线程就可以退出。

引用 Javadocs:

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

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

当您的线程调用queue.take()时,它们应该具有类似于以下代码的内容:

  try {
      work = queue.take();
      ...
  } catch (InterruptedException e) {
      // re-interrupt the thread which is always a good pattern
      Thread.currentThread().interrupt();
      // quit the processing thread
      return;
  }
于 2013-03-26T12:10:00.047 回答
2

你可以做这样的事情可能吗?

 executor.shutdown();
    if (!executor.awaitTermination(SHUTDOWN_TIME)) {
        executor.shutdownNow();
    }
于 2013-03-26T10:59:15.817 回答
1

正如take 的 javadoc 中InterruptedException所指定的,当线程等待被中断时,它会抛出一个。因此,您需要确保您的执行程序实现将调用Thread.interrupt()在它拥有的所有线程上shutdown

于 2013-03-26T11:03:27.620 回答