我有一個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