問八:InterruptedExcption詳細分析?

當一個方法後面聲明可能會拋出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方法的源代碼中,是有一個is_interrupted的判斷的,因此當在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異常的

Thread.isInterrupted方法,可以用來檢查中斷狀態

Thread.interrupted方法,可以用來檢查並清除中斷狀態

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章