2012-09-14 182 views
2

對於任何Java Master來說,這應該是一個簡單的要求。我作爲新手只是想確認一件事。Java InterruptedException暫停線程?

我有一個類實現Runnable,並且像許多這樣的類,它的run()方法有一個無限循環。我想做一些任務,然後睡覺一分鐘,然後再回來。

如果在線程休眠時遇到中斷異常,會發生什麼情況?

我認爲會發生的事情是線程被暫停,現在無限循環無法保持線程運行。我想確認我的理解是否正確。

如果發生這種情況,將會有什麼可能的解決方案再次啓動線程。

+0

這應該有好處。如果閱讀是你的特長... http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – trappedIntoCode

回答

2

你的理解大多是正確的 - 當你的線程正在休眠時,如果它被中斷,這將導致InterruptedException被拋出 - 你的run()中的代碼將不得不趕上它並做它想做的事情。線程本身不會被掛起 - 因爲在該線程上繼續執行主動執行。

在處理catch塊中的InterruptedException後,您可能想要繼續執行線程。

+1

請注意,InterruptedException最常用於向某個線程發出信號,表明它應該停止正在進行的操作。因此,捕獲並忽略此異常是讓應用程序掛起關機的好方法。 – jtahlborn

+1

@jtahlborn,你對'InterruptedException'後面的意義和處理是正確的,但問題不在於此。 – Bhaskar

+0

最確定的問題就是這個問題。 OP在詢問如何忽略InteruptedExcepiont。我只是添加了這樣的警告,即可能不會真的是件好事。 – jtahlborn

6

錯誤。
InterruptedException只會終止sleep()調用並拋出異常。
只要您適當地處理異常,您的線程將繼續運行。

+0

如果我將線程的狀態設置爲由Thread.currentThread()中斷,該怎麼辦。打斷(); 其中我發現異常 – peterd

0

線程不會被掛起。

如果您發現InterruptedException,執行將繼續在您的異常處理程序中執行。

如果你沒有趕上InterruptedException,線程將終止。

+0

在run()方法中 - 除了捕捉IE之外別無選擇 - 這是一個檢查的異常,你不能把它放到'throws'子句中。在其他地方你可以做到這一點,是的,你可能會讓它冒出來。 – Bhaskar

+0

@Bhaskar:真的,你必須抓住它,並將其包裝在一個未經檢查的例外中,以便一路搞定。 –

0

對於除線程取消之外的任何事情都使用中斷是不鼓勵的。就像JTalhborn在對另一個答案的評論中說的那樣,中斷被用來告訴線程它應該找到一個停止點並退出,如果你使用中斷來做其他事情,那麼你的線程可能不會適當地處理關閉。另外,iirc還擔心許多使用的組件(如java.util.concurrent或guava中的組件)可能會假定中斷僅用於取消,因此如果您使用其他中斷,則這些對象可能無法執行您想要的操作。重點是,如果你的線程被打斷,你甚至不應該考慮如何繼續,因爲這是放棄時間。

InterruptedExceptions不會發生。一些例外,如IOExceptions,由於媒體固有的脆弱性而發生不可預測的情況,但中斷情況並非如此。中斷是線程的故意信號,通常由應用程序在關閉時發送,它應該完成其工作並停止運行。