Java線程之 InterruptedException 異常


 

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

 

----------------------------------------------------

本文主要內容來自Java多線程設計模式一書

微信公眾號【黃小斜】大廠程序員,互聯網行業新知,終身學習踐行者。關注后回復「Java」、「Python」、「C++」、「大數據」、「機器學習」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「筆試」、「面試」、「面經」、「計算機基礎」、「LeetCode」 等關鍵字可以獲取對應的免費學習資料。 

 

 

                     


免責聲明!

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



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