1. 程式人生 > >執行緒之 InterruptedException 異常

執行緒之 InterruptedException 異常

轉載https://www.cnblogs.com/xll1025/p/6415378.html

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這些方法的時候,呼叫了它的interrupt方法才會丟擲InterruptedException。 

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

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