interrupt()是給執行緒設定中斷標誌;interrupted()是檢測中斷並清除中斷狀態;isinterrupted()只檢測中斷。還有重要的一點就是interrupted()作用於當前執行緒,interrupt()和isinterrupted()作用於此執行緒,即**中呼叫此方法的例項所代表的執行緒。
首先看看官方說明:
interrupt()方法
其作用是中斷此執行緒(此執行緒不一定是當前執行緒,而是指呼叫該方法的thread例項所代表的執行緒),但實際上只是給執行緒設定乙個中斷標誌,執行緒仍會繼續執行。
interrupted()方法
作用是測試當前執行緒是否被中斷(檢查中斷標誌),返回乙個boolean並清除中斷狀態,第二次再呼叫時中斷狀態已經被清除,將返回乙個false。
isinterrupted()方法
作用是只測試此執行緒是否被中斷 ,不清除中斷狀態。
下面我們進行測試說明:
定義乙個mythread類,繼承thread,如下:
public class mythread extends thread {
@override
public void run() {
for (int i = 0; i < 10; i++) {
system.out.println("i="+(i+1));
在main方法中測試:
public class do {
public static void main(string args ) {
mythread thread=new mythread();
thread.start();
thread.interrupt();
system.out.println("第一次呼叫thread.isinterrupted():"+thread.isinterrupted());
system.out.println("第二次呼叫thread.isinterrupted():"+thread.isinterrupted());
system.out.println("thread是否存活:"+thread.isalive());
輸出如下:
從結果可以看出呼叫interrupt()方法後,執行緒仍在繼續執行,並未停止,但已經給執行緒設定了中斷標誌,兩個isinterrupted()方法都會輸出true,也說明isinterrupted()方法並不會清除中斷狀態。
下面我們把**修改一下,多加兩行呼叫interrupted()方法:
public class do {
public static void main(string args ) {
mythread thread=new mythread();
thread.start();
thread.interrupt();
system.out.println("第一次呼叫thread.isinterrupted():"+thread.isinterrupted());
system.out.println("第二次呼叫thread.isinterrupted():"+thread.isinterrupted());
//測試interrupted()函式
system.out.println("第一次呼叫thread.interrupted():"+thread.interrupted());
system.out.println("第二次呼叫thread.interrupted():"+thread.interrupted());
system.out.println("thread是否存活:"+thread.isalive());
輸出如下:
從輸出結果看,可能會有疑惑,為什麼後面兩個interrupted方法輸出的都是false,而不是預料中的乙個true乙個false?注意!!!這是乙個坑!!!上面說到,interrupted()方法測試的是當前執行緒是否被中斷,當前執行緒!!!當前執行緒!!!這裡當前執行緒是main執行緒,而thread.interrupt()中斷的是thread執行緒,這裡的此執行緒就是thread執行緒。所以當前執行緒main從未被中斷過,儘管interrupted()方法是以thread.interrupted()的形式被呼叫,但它檢測的仍然是main執行緒而不是檢測thread執行緒,所以thread.interrupted()在這裡相當於main.interrupted()。對於這點,下面我們再修改進行測試。
thread.currentthread()函式可以獲取當前執行緒,下面**中獲取的是main執行緒
public class do {
public static void main(string args ) throws interruptedexception {
thread.currentthread().interrupt();
system.out.println("第一次呼叫thread.currentthread().interrupt():"
+thread.currentthread().isinterrupted());
system.out.println("第一次呼叫thread.interrupted():"
+thread.currentthread().interrupted());
system.out.println("第二次呼叫thread.interrupted():"
+thread.currentthread().interrupted());
這裡都是針對當前執行緒在操作,如果interrupted()方法有檢測中斷並清除中斷狀態的作用,預料中的輸出應該是true-true-false,實際輸出如下:
結果證明猜想是正確的。
修改mythread類:
public class mythread extends thread {
@override
public void run() {
for (int i = 0; i < 1000; i++) {
system.out.println("i="+(i+1));
if(this.isinterrupted()){
system.out.println("通過this.isinterrupted()檢測到中斷");
system.out.println("第乙個interrupted()"+this.interrupted());
system.out.println("第二個interrupted()"+this.interrupted());
break;
system.out.println("因為檢測到中斷,所以跳出迴圈,執行緒到這裡結束,因為後面沒有內容了");
測試mythread:
public class do {
public static void main(string args ) throws interruptedexception {
mythread mythread=new mythread();
mythread.start();
mythread.interrupt();
//sleep等待一秒,等mythread執行完
thread.currentthread().sleep(1000);
system.out.println("mythread執行緒是否存活:"+mythread.isalive());
結果:最後總結,關於這三個方法,interrupt()是給執行緒設定中斷標誌;interrupted()是檢測中斷並清除中斷狀態;isinterrupted()只檢測中斷。還有重要的一點就是interrupted()作用於當前執行緒,interrupt()和isinterrupted()作用於此執行緒,即**中呼叫此方法的例項所代表的執行緒。
interrupt 執行緒相關
1.sleep interrupt 執行緒a正在使用sleep 暫停著 thread.sleep 100000 如果要取消他的等待狀態,可以在正在執行的執行緒裡 比如這裡是b 呼叫 a.interrupt 令執行緒a放棄睡眠操作,這裡a是執行緒a對應到的thread例項 執行interrupt 時,...
執行緒中斷interrupt
案例 這裡需要注意一下,try catch到interruptedexception e異常時,中斷訊號會被抹除,所以th.isinterrupted 如果執行在catch異常前,則isinterrupted為true,可以正常退出,否則中斷訊號抹除後,isinterrupted得到的值為false...
執行緒打斷interrupt
j a在之前是有執行緒打斷方法的,但是都已經不推薦使用了,原因如下 現在如果你希望打斷乙個執行緒,需要使用interrupt方法 第乙個interrupt方法 分析一下 執行緒打斷不保證成功,如果打斷的執行緒不是自己,那麼就需要去檢查自己是否有這個許可權去打斷乙個執行緒,檢測過程中,如果打斷者沒有許...