案例:
/**
* 這裡需要注意一下,try catch到interruptedexception e異常時,中斷訊號會被抹除,
* 所以th.isinterrupted()如果執行在catch異常前,則isinterrupted為true,可以正常退出,否則中斷訊號抹除後,
* isinterrupted得到的值為false,故還是死迴圈
*/public
class
threadinterruptluban
catch
(interruptedexception e)
system.out.
println
("-----next");
system.out.
println
(th.
isinterrupted()
);}}
);th.
start()
;try
catch
(interruptedexception e)
th.interrupt()
; flag=th.
isinterrupted()
; system.out.
println
("flag : "
+flag);}
}
當當前執行緒被進入阻塞狀態,若另外的乙個執行緒呼叫被阻塞的interrupt方法,則會打斷這種阻塞,因此這種方法有時會被稱為可中斷方法,記住,打斷乙個執行緒並不等於該執行緒的生命週期結束,僅僅是打斷了當前執行緒的阻塞狀態。
一但執行緒在阻塞的情況下被打斷,都會丟擲interruptedexception的異常,這個異常就像乙個signal(訊號)一樣通知當前執行緒被打斷了。
例項:
/**
* created by yd on 2019/5/30.
*/public
class
threadinterrupt
catch
(interruptedexception e)}}
; thread.
start()
; timeunit.milliseconds.
sleep(2
);thread.
interrupt()
;}}
執行結果:
oh, i am be interrupted
isinterrupted主要判斷當前執行緒是否被中斷,該方法僅是對interrupt標識的乙個判斷,並不會影響標識發生任何改變!
案例:
public
class
threadidinterrupted}}
; thread.
start()
; timeunit.milliseconds.
sleep(2
);system.out.
printf
("thread is interrupted ? %s\n"
, thread.
isinterrupted()
);thread.
interrupt()
; system.out.
printf
("thread is interrupted ? %s\n"
, thread.
isinterrupted()
);}}
執行結果:
thread is interrupted ?
false
thread is interrupted ?
true
可中斷方法捕獲到了中斷訊號(signal)之後,也就是捕獲了interruptedexception異常後會擦除掉interrupt標識。
由於在run方法中使用了sleep這個可中斷方法,它會捕獲到中斷訊號,並且會擦除interrupt標識,因此程式的執行結果都會是false;
案例2:
public
class
threadidinterrupted2
catch
(interruptedexception e)}}
};thread.
setdaemon
(true);
thread.
start()
; timeunit.milliseconds.
sleep(2
);system.out.
printf
("thread is interrupted ? %s\n"
, thread.
isinterrupted()
);thread.
interrupt()
; timeunit.milliseconds.
sleep(2
);system.out.
printf
("thread is interrupted ? %s\n"
, thread.
isinterrupted()
);}}
執行結果:
thread is interrupted ?
false
i am be interrupted ?
false
thread is interrupted ?
false
其實這也不難理解,可中斷方法捕獲到了中斷訊號之後,為了不影響執行緒中其他方法的執行,將執行緒的interrupt標識復位是一種合理的設計。
interrupted是乙個靜態方法,雖然其也用於判斷當前執行緒是否被中斷,但是它和成員方法isinterrupted有很大區別,呼叫該方法會直接擦除掉執行緒的interrupt標識,需要注意的是,如果當前執行緒被打斷了,那麼第一次呼叫interrupted方法會返回true,並且立即擦除了interrupt標識;第二次包括以後的呼叫永遠都會返回false,除非在此期間執行緒又一次被打斷。
案例:
public
class
threadidinterrupted3
catch
(interruptedexception e)
}}
執行結果:
main is interrupted ?
false
main is isinterrupted ?
true
main is interrupted ?
true
main is interrupted ?
false
執行緒中斷時,呼叫interrupted會立即擦除了interrupt標識,所以無法進入捕獲interruptedexception異常的處理邏輯中! 中斷執行緒 interrupt
呼叫interrupt 通知執行緒應該中斷 1 如果執行緒處於阻塞狀態,則執行緒立即退出被阻塞狀態,並丟擲乙個interruptedexception異常 2 如果執行緒處於正常活動狀態,那 package com.mall.controllor.alene import sun.managemen...
雜談 執行緒中斷 Interrupt
以前有乙個錯誤的認識,以為中斷操作都會丟擲異常,後來才發現並不是這樣,所以今天就來做乙個關於中斷的總結。已被棄用的stop方法 早期,thread類中有乙個stop方法,用於強行關閉乙個執行緒。但是後來發現此操作並不安全,強行關閉可能導致一致性問題。故stop方法已被官方棄用。具體原因請看why a...
Java 多執行緒 interrupt 中斷
當乙個執行緒執行時,另乙個執行緒可以呼叫對應的thread物件的interrupt 方法來中斷它,該方法只是在目標執行緒中設定乙個標誌,表示它已經被中斷,並立即返回。這裡需要注意的是,如果只是單純的呼叫interrupt 方法,執行緒並沒有實際被中斷,會繼續往下執行。created by yangt...