java中的interrupt 方法

2021-08-28 15:04:47 字數 1250 閱讀 3788

interrupt() 方法只是改變中斷狀態而已,它不會中斷乙個正在執行的執行緒。如果執行緒被object.wait, thread.join和thread.sleep三種方法之一阻塞,此時呼叫該執行緒的interrupt()方法,那麼該執行緒將丟擲乙個 interruptedexception中斷異常。

1. sleep() &interrupt()

當在sleep中時執行緒被呼叫interrupt()時,就馬上會放棄暫停的狀態並丟擲interruptedexception。丟擲異常的,是a執行緒。

2. wait() &interrupt()

執行緒a呼叫了wait()進入了等待狀態,也可以用interrupt()取消。不過這時候要注意鎖定的問題。執行緒在進入等待區,會把鎖定解除,當對等待中的執行緒呼叫interrupt()時,會先重新獲取鎖定,再丟擲異常。在獲取鎖定之前,是無法丟擲異常的。

3. join() &interrupt()

當執行緒以join()等待其他執行緒結束時,當它被呼叫interrupt(),它與sleep()時一樣,會馬上跳到catch塊裡.。

interrupt()的作用是中斷本執行緒。

本執行緒中斷自己是被允許的;其它執行緒呼叫本執行緒的interrupt()方法時,會通過checkaccess()檢查許可權。這有可能丟擲securityexception異常。

如果本執行緒是處於阻塞狀態:呼叫執行緒的wait(), wait(long)或wait(long, int)會讓它進入等待(阻塞)狀態,或者呼叫執行緒的join(), join(long), join(long, int), sleep(long), sleep(long, int)也會讓它進入阻塞狀態。若執行緒在阻塞狀態時,呼叫了它的interrupt()方法,那麼它的「中斷狀態」會被清除並且會收到乙個interruptedexception異常。例如,執行緒通過wait()進入阻塞狀態,此時通過interrupt()中斷該執行緒;呼叫interrupt()會立即將執行緒的中斷標記設為「true」,但是由於執行緒處於阻塞狀態,所以該「中斷標記」會立即被清除為「false」,同時,會產生乙個interruptedexception的異常。

如果執行緒被阻塞在乙個selector選擇器中,那麼通過interrupt()中斷它時;執行緒的中斷標記會被設定為true,並且它會立即從選擇操作中返回。

如果不屬於前面所說的情況,那麼通過interrupt()中斷執行緒時,它的中斷標記會被設定為「true」。

中斷乙個「已終止的執行緒」不會產生任何操作。

JAVA執行緒的interrupt

interrupt 只是改變中斷狀態而已.interrupt 不會中斷乙個正在執行的執行緒。這一方法實際上完成的是,給受阻塞的執行緒丟擲乙個中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態 更確切 的說,如果執行緒被 object.wait,thread.join 和thread.sleep 三種方法之...

JAVA執行緒的interrupt

interrupt 只是改變中斷狀態而已.interrupt 不會中斷乙個正在執行的執行緒。這一方法實際上完成的是,給受阻塞的執行緒丟擲乙個中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態 更確切 的說,如果執行緒被 object.wait,thread.join 和thread.sleep 三種方法之...

JAVA執行緒的interrupt

interrupt 只是改變中斷狀態而已.interrupt 不會中斷乙個正在執行的執行緒。這一方法實際上完成的是,給受阻塞的執行緒丟擲乙個中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態 更確切 的說,如果執行緒被 object.wait,thread.join 和thread.sleep 三種方法之...