InterruptedException 異常

當一個方法後面聲明可能會拋出InterruptedException 異常時,說明該方法是可能會花一點時間,可是能夠取消的方法。java

拋InterruptedException的表明方法有:線程

1. java.lang.Object 類的 wait 方法it

2. java.lang.Thread 類的 sleep 方法io

3. java.lang.Thread 類的 join 方法程序

須要花點時間的方法 執行wait方法的線程,會進入等待區等待被notify/notify All。在等待期間,線程不會活動。執行sleep方法的線程,會暫停執行參數內所設置的時間。 執行join方法的線程,會等待到指定的線程結束爲止。 所以,上面的方法都是須要花點時間的方法.方法

能夠取消的方法 由於須要花時間的操做會下降程序的響應性,因此可能會取消/中途放棄執行這個方法。異常

這裏主要是經過interrupt方法來取消。時間

1. sleep方法與interrupt方法 interrupt方法是Thread類的實例方法,在執行的時候並不須要獲取Thread實例的鎖定,任何線程在任什麼時候刻,均可以經過線程實例來調用其餘線程的interrupt方法。 當在sleep中的線程被調用interrupt方法時,就會放棄暫停的狀態,並拋出InterruptedException異常,這樣一來,線程的控制權就交給了捕捉這個異常的catch塊了。join

2. wait方法和interrupt方法 當線程調用wait方法後,線程在進入等待區時,會把鎖定接觸。當對wait中的線程調用interrupt方法時,會先從新獲取鎖定,再拋出InterruptedException異常,獲取鎖定以前,沒法拋出InterruptedException異常。參數

3. join方法和interrupt方法 當線程以join方法等待其餘線程結束時,同樣可使用interrupt方法取消。由於join方法不須要獲取鎖定,故而與sleep同樣,會立刻跳到catch程序塊

 

-- interrupt方法幹了什麼?

interrupt方法其實只是改變了中斷狀態而已。 而sleep、wait和join這些方法的內部會不斷的檢查中斷狀態的值,從而本身拋出InterruptEdException。 因此,若是在線程進行其餘處理時,調用了它的interrupt方法,線程也不會拋出InterruptedException的,只有當線程走到了sleep, wait, join這些方法的時候,纔會拋出InterruptedException。如果沒有調用sleep, wait, join這些方法,或者沒有在線程裏本身檢查中斷狀態,本身拋出InterruptedException,那InterruptedException是不會拋出來的。 isInterrupted方法,能夠用來檢查中斷狀態 Thread.interrupted方法,能夠用來檢查並清除中斷狀態。

相關文章
相關標籤/搜索