好吧,我讀java.Now參與中斷的文章中,我不明白的樣本非常好,如下圖所示: 爲什麼它會導致無限循環這裏
我不知道爲什麼它會在那裏造成一個無限循環。什麼是「它不能早一點恢復中斷狀態」的意思。 感謝任何幫助。謝謝。
好吧,我讀java.Now參與中斷的文章中,我不明白的樣本非常好,如下圖所示: 爲什麼它會導致無限循環這裏
我不知道爲什麼它會在那裏造成一個無限循環。什麼是「它不能早一點恢復中斷狀態」的意思。 感謝任何幫助。謝謝。
我想知道爲什麼它會導致無限循環there.What「它不能恢復中斷狀態」的意思。
所以通常你恢復中斷狀態立即在catch
塊。但是,如果在這種情況下完成,然後循環並再次調用take()
,則會導致另一個投擲InterruptedException
和一個無限循環。
對我來說,代碼的問題是爲什麼,如果線程被中斷,代碼循環並再次調用take()
。通常我們在一個循環,是這樣的:
while (!Thread.currentThread().isInterrupted()) {
...
}
也許代碼的作者是混淆了虛假中斷虛假喚醒?我不認爲後者確實發生。當然會發生虛假喚醒,但這些都是由queue.take()
方法內部處理的。
通常我們恢復線程中斷狀態的東西,如下面的代碼:
try {
queue.take();
} catch (InterruptedException ie) {
// because catching InterruptedException clears the thread interrupt bit,
// we immediately re-interrupt the current thread.
Thread.currentThread().interrupt();
// handle the interrupt here by quitting or returning or ...
}
我猜如果是這樣的話,一旦你立即在catch子句中調用Thread.currentThread().interrupt(),將導致queue.take()再次拋出一個InterruptedException,所以會有一個無限循環。我對嗎? –
@tuanlong是的,它可能只是快速從'take()'出來並立即拋出異常。如果你忽略它並且不重置標誌,它將會一遍又一遍地繼續。 –
@JohnVint:謝謝。 –
如果網站上說take()
引發InterruptedException
,就會發生無限循環。
這是因爲在返回表達式之前評估表達式,所以如果評估表達式拋出異常,您立即跳轉到catch
塊,跳過return
。
如果'queue'爲null,則會拋出'NullPointerException',並且由於它不被捕獲,它只會冒泡。在這種情況下,我認爲它不會無限循環。 – matt
你說得對,我的眼睛正在努力閱讀那些小小的文字。 –
我很抱歉,我沒有注意到那張照片太小而無法閱讀。下次我會關注它的。非常感謝。 –
@Gray:我對此感到抱歉。 –