我的Runnable
来自Executor
在SychronousQueue.take
中阻止了runnable等待。如何在take
时确保executor.shutdown
被中断?
答案 0 :(得分:2)
你可以做这样的事情吗?
executor.shutdown();
if (!executor.awaitTermination(SHUTDOWN_TIME)) {
executor.shutdownNow();
}
答案 1 :(得分: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;
}
答案 2 :(得分:1)
如javadoc of take中所指定,当线程等待中断时,它将抛出InterruptedException
。因此,您需要确保执行程序实现将在shutdown
上的所有线程上调用Thread.interrupt()。