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