2014-01-06 84 views
0

好吧,我讀java.Now參與中斷的文章中,我不明白的樣本非常好,如下圖所示: enter image description here爲什麼它會導致無限循環這裏

我不知道爲什麼它會在那裏造成一個無限循環。什麼是「它不能早一點恢復中斷狀態」的意思。 感謝任何幫助。謝謝。

+0

@Gray:我對此感到抱歉。 –

回答

1

我想知道爲什麼它會導致無限循環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 ... 
} 
+0

我猜如果是這樣的話,一旦你立即在catch子句中調用Thread.currentThread().interrupt(),將導致queue.take()再次拋出一個InterruptedException,所以會有一個無限循環。我對嗎? –

+0

@tuanlong是的,它可能只是快速從'take()'出來並立即拋出異常。如果你忽略它並且不重置標誌,它將會一遍又一遍地繼續。 –

+0

@JohnVint:謝謝。 –

1

如果網站上說take()引發InterruptedException,就會發生無限循環。

這是因爲在返回表達式之前評估表達式,所以如果評估表達式拋出異常,您立即跳轉到catch塊,跳過return

+1

如果'queue'爲null,則會拋出'NullPointerException',並且由於它不被捕獲,它只會冒泡。在這種情況下,我認爲它不會無限循環。 – matt

+0

你說得對,我的眼睛正在努力閱讀那些小小的文字。 –

+1

我很抱歉,我沒有注意到那張照片太小而無法閱讀。下次我會關注它的。非常感謝。 –

相關問題