我正想通過Oracle的Java教程的主題,我看到這個例子java的混亂
源:http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
如果一個線程進入一個很長一段時間,而不必調用一個方法拋出InterruptedException?然後它必須定期調用Thread.interrupted,如果接收到中斷,則返回true。例如:
for (int i = 0; i < inputs.length; i++) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
return;
}
教程添加: 中斷機構被使用被稱爲中斷狀態的內部標誌實現。調用Thread.interrupt設置此標誌。當一個線程通過調用靜態方法Thread.interrupted來檢查中斷時,中斷狀態被清除。一個線程用於查詢另一個線程的中斷狀態的非靜態isInterrupted方法不會更改中斷狀態標誌。
按照慣例,任何通過拋出InterruptedException退出的方法都會清除中斷狀態。但是,通過另一個線程調用中斷,可能會立即再次設置中斷狀態。
現在我很困惑。它何時發生?如果有中斷,不應該線程收到InterruptedException?
當有人可能使用這些方法檢查他們的代碼? Thread.interrupt(該標誌)是靜態的,所以通過上面的檢查,我們實際上檢查是否有任何踏板已經中斷?即使是這樣,根據教程,當一個線程通過調用靜態方法Thread.interrupted檢查中斷時,中斷狀態被清除。或任何通過拋出InterruptedException而退出的方法在清除中斷狀態時會清除中斷狀態
因此,我是否錯過了某些東西?或者這只是有用的,如果某個線程收到中斷,但不檢查它,或不扔它?
問題的癥結在於你要麼手動檢查你的線程的中斷狀態,要麼你會處理一個'InterruptedException'。 – Perception