我有一个Runnable
,它从Executor
运行。
可运行模块被阻止在SychronousQueue.take
中等待。如何确保take
在我executor.shutdown
时会中断?在阻塞队列中等待时的中断
0
A
回答
2
+1 to @Eugene。 ExecutorService.shutdown()
关闭线程池,但任何提交的作业都将继续运行直至完成。如果您使用shutdownNow()
,它实际上会中断这些线程。这并不意味着他们会立即停止,但这意味着如果他们被阻止在queue.take()
或他们的下一个电话queue.take()
它会抛出InterruptedException
,以便线程可以退出。
从的Javadoc引用:
尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务列表。
除了竭尽全力尝试停止处理主动执行的任务之外,没有任何保证。例如,典型的实现将通过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
你可以做这样的事情吗?
executor.shutdown();
if (!executor.awaitTermination(SHUTDOWN_TIME)) {
executor.shutdownNow();
}
1
正如javadoc of take指定它会抛出一个InterruptedException
当线程在等待被中断。因此,您需要确保您的执行程序实施将在shutdown
上拥有的所有线程上调用Thread.interrupt()。
相关问题
- 1. Scala阻塞队列,正常等待
- 2. 阻塞队列将等待元素出列多长时间?
- 3. 中断线程后的时间量,没有阻塞而等待
- 4. 非阻塞等待
- 5. 如何在Windows中正常中断阻塞等待?
- 6. Java中的阻塞队列
- 7. 的Java的TimerTask应该等待一个阻塞队列
- 8. 中断阻塞从套接字等待IO的线程?
- 9. 中断等待阻塞操作的线程?
- 10. 异步等待/非阻塞在python中等待
- 11. 键盘中断的阻塞队列在Python
- 12. 线程阻塞后等待
- 13. 等待并发GC阻塞
- 14. 为什么Crawler4j非阻塞方法没有等待队列中的链接?
- 15. 非阻塞队列
- 16. 阻塞队列Ç
- 17. 在等待队列上放置进程时发生中断
- 18. 多线程:阻塞等待超时
- 19. 阻塞队列不阻塞线程?
- 20. LinkedTransferQueue是阻塞队列还是非阻塞队列?
- 21. Java中的并发和阻塞队列
- 22. Java,被阻塞的队列
- 23. 为什么在将阻塞函数放入队列时jQuery的动画中断?
- 24. 非阻塞在等待而不TPL 3.5
- 25. 如何等待python中没有阻塞计时器的输入?
- 26. 不断从阻塞队列中获取数据
- 27. 阻塞队列实现
- 28. 测试非阻塞队列
- 29. 队列阻塞主线程
- 30. 阻塞队列和InterruptedException
shutdownNow时?也许 – Eugene 2013-03-26 10:49:14
ShutdownNow只是不执行其余的任务。问题是当线程被阻塞在'take'时会发生什么 – Jim 2013-03-26 10:51:17
事情是SynchronousQueue可能是空的,因此take()会阻塞,直到put()会发生。你可以用LinkedBlockingQueue替换它吗? – Eugene 2013-03-26 10:53:46