InterruptedException 異常


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

拋InterruptedException的代表方法有:

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

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

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

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

可以取消的方法 因為需要花時間的操作會降低程序的響應性,所以可能會取消/中途放棄執行這個方法。

這里主要是通過interrupt方法來取消。

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

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方法,可以用來檢查並清除中斷狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM