我有一个Runnable
从Executor
.
可运行对象被阻塞在SychronousQueue.take
. 我怎样才能确保take
我这样做时会被打断executor.shutdown
?
问问题
1696 次
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 回答