對於任何Java Master來說,這應該是一個簡單的要求。我作爲新手只是想確認一件事。Java InterruptedException暫停線程?
我有一個類實現Runnable,並且像許多這樣的類,它的run()方法有一個無限循環。我想做一些任務,然後睡覺一分鐘,然後再回來。
如果在線程休眠時遇到中斷異常,會發生什麼情況?
我認爲會發生的事情是線程被暫停,現在無限循環無法保持線程運行。我想確認我的理解是否正確。
如果發生這種情況,將會有什麼可能的解決方案再次啓動線程。
對於任何Java Master來說,這應該是一個簡單的要求。我作爲新手只是想確認一件事。Java InterruptedException暫停線程?
我有一個類實現Runnable,並且像許多這樣的類,它的run()方法有一個無限循環。我想做一些任務,然後睡覺一分鐘,然後再回來。
如果在線程休眠時遇到中斷異常,會發生什麼情況?
我認爲會發生的事情是線程被暫停,現在無限循環無法保持線程運行。我想確認我的理解是否正確。
如果發生這種情況,將會有什麼可能的解決方案再次啓動線程。
你的理解大多是正確的 - 當你的線程正在休眠時,如果它被中斷,這將導致InterruptedException
被拋出 - 你的run()
中的代碼將不得不趕上它並做它想做的事情。線程本身不會被掛起 - 因爲在該線程上繼續執行主動執行。
在處理catch塊中的InterruptedException
後,您可能想要繼續執行線程。
錯誤。
InterruptedException
只會終止sleep()
調用並拋出異常。
只要您適當地處理異常,您的線程將繼續運行。
如果我將線程的狀態設置爲由Thread.currentThread()中斷,該怎麼辦。打斷(); 其中我發現異常 – peterd
線程不會被掛起。
如果您發現InterruptedException
,執行將繼續在您的異常處理程序中執行。
如果你沒有趕上InterruptedException
,線程將終止。
在run()方法中 - 除了捕捉IE之外別無選擇 - 這是一個檢查的異常,你不能把它放到'throws'子句中。在其他地方你可以做到這一點,是的,你可能會讓它冒出來。 – Bhaskar
@Bhaskar:真的,你必須抓住它,並將其包裝在一個未經檢查的例外中,以便一路搞定。 –
對於除線程取消之外的任何事情都使用中斷是不鼓勵的。就像JTalhborn在對另一個答案的評論中說的那樣,中斷被用來告訴線程它應該找到一個停止點並退出,如果你使用中斷來做其他事情,那麼你的線程可能不會適當地處理關閉。另外,iirc還擔心許多使用的組件(如java.util.concurrent或guava中的組件)可能會假定中斷僅用於取消,因此如果您使用其他中斷,則這些對象可能無法執行您想要的操作。重點是,如果你的線程被打斷,你甚至不應該考慮如何繼續,因爲這是放棄時間。
InterruptedExceptions不會發生。一些例外,如IOExceptions,由於媒體固有的脆弱性而發生不可預測的情況,但中斷情況並非如此。中斷是線程的故意信號,通常由應用程序在關閉時發送,它應該完成其工作並停止運行。
這應該有好處。如果閱讀是你的特長... http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – trappedIntoCode