讓我們假設我有一個消耗另一個線程產生的物品的線程。它的運行方法如下,與INQUEUE是一個BlockingQueue的BlockingQueue.take在什麼情況下會拋出異常中斷?
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
此外,不同的線程將發出信號,有通過中斷這個正在運行的線程沒有更多的工作項目。如果不需要阻塞以檢索下一個工作項,將採取()拋出一個被中斷的異常。即如果生產者發出信號表示已完成填充工作隊列,是否可能意外地將一些項目留在隊列中或錯過中斷?
你已經差不多了。而不是讓* consumer *在中斷時將「shutdown」設置爲true,而是讓* producer *在中斷消費者之前將其設置爲true。注意這個A)通過避免一個前哨值(「毒丸」)來保持漂亮,B)正確地處理虛假喚醒,C)更通用,因爲無論隊列是否爲空,你都可以故意停止消費者。 – user359996 2012-08-09 20:59:56