2011-05-06 77 views
0

我有以下代碼線程在睡眠中暫停後會發生什麼?

try{ 
    sleep(500); 
}catch(InterruptedException e){} 

被拋出時,線程完成睡覺或當interrupt方法被調用該線程上InterruptedException

+0

這顯然是在Thread的javadoc中記錄的。你爲什麼不讀它來找出答案?請參閱http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html – 2011-05-06 07:38:22

+1

您應該幾乎從不捕獲異常並將其丟棄,但您已被原諒,因爲這僅僅是一個示例 – rurouni 2011-05-06 07:47:59

+0

例外情況應該適用於特殊情況。他們不應該經常發生。 – 2011-05-06 08:32:35

回答

5

否,InterruptedException在正常流程中不會拋出,但可能在線程上調用interrupt()(例如通過嘗試中斷此線程的正常執行流程的其他代碼)時發生。 正常情況下,執行只是在sleep語句之後繼續執行。

3

如果在休眠時間內調用interrupt方法。 catch僅適用於try的代碼,之後它不起作用。

2

如果線程在睡眠期間或可能發生在前一段時間可能發生的線程中斷,則拋出InterruptedException。在大多數情況下,當你不指望InterruptedException的,不想來處理它,它IST更好地

try{ 
    sleep(500); 
}catch(InterruptedException e){ 
    Thread.currentThread().interrupt(); 
} 

因此中斷不會丟失。

+0

這不是處理這種情況的好方法。當線程中斷時,表示線程應該停止。 InterruptedException僅在線程正在等待時(睡眠,阻止IO操作...)引發。如果線程正在處理,則不會拋出異常,您有責任定期檢查中斷狀態以停止處理並讓線程終止。在你的情況下,你的中斷代碼是完全沒用的。 – 2011-05-06 08:38:05

+0

@Nicolas:如果你準備好處理InterruptedException,那麼你是對的,但是如果你在一個只從Object.wait(int)中得到InterruptedException的輔助方法中,你就沒有機會終止Thread。要麼你的方法拋出InterruptedException,要麼保留中斷狀態,所以調用的代碼可以處理它。 – rurouni 2011-05-06 08:48:00

+0

只是讓異常傳播,或者如果你不想處理被檢查的異常以重新拋出一個未經檢查的異常,會不會更好? – 2011-05-06 08:54:21