當一個方法后面聲明可能會拋出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」 等關鍵字可以獲取對應的免費學習資料。