線程打斷是自我打斷
當調(diào)用線程的interrupt()
方法時蜻牢,被打斷的線程不會立刻被打斷平夜,只是它里面的一個狀態(tài)被改變.
@Override
public void run() {
//線程被其他線程打斷時刻像,但還會一直執(zhí)行
while (true) {
//true
System.out.println("線程是否被打斷:" + this.isInterrupted());
//true
System.out.println("線程確認是否被打斷:" + this.isInterrupted());
}
}
interrupted()會使中斷狀態(tài)重置
被中斷線程可以通過interrupted()對狀態(tài)進行檢測粟瞬,如果是被中斷狀態(tài)時,返回true混巧,然后注意枪向,此時的中斷狀態(tài)會被重置到未被打斷狀態(tài),因此牲剃,被中斷線程可以通過調(diào)用一次該值不做任何處理遣疯,讓自己不被中斷.
@Override
public void run() {
while (true) {
//true
System.out.println("線程是否被打斷:" + this.isInterrupted());
//true
System.out.println("線程確認是否被打斷:" + this.isInterrupted());
//判斷是否被中斷
if(Thread.interrupted()){
System.out.println("線程被中斷");
//此時返回 false
System.out.println("Thread.interupted():"+Thread.interrupted());
break;
}
}
}
isInterrupted()方法不會重置清除狀態(tài)
內(nèi)部調(diào)用本地方法 private native boolean isInterrupted(boolean ClearInterrupted);
參數(shù)為false.
而上面的interrupted()方法也是調(diào)用了這個本地方法,只不過參數(shù)為ture.
InterruptedException異常不代表線程被中斷
另外的線程調(diào)用一個正在sleep(),或者wait()的線程的interrupt方法時,此時被中斷線程會拋出一個異常缠犀,說明在休眠的線程中斷是會被通知的数苫,且此時的中斷狀態(tài)為false,也就是說中斷休眠的線程是不會成功的,所以線程還是要自我打斷的辨液。
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("捕獲中斷異常");
//輸出 false
System.out.println("線程確認是否被打斷:"+this.isInterrupted());
//輸出true
this.interrupt();
System.out.println("是否被self打斷:"+this.isInterrupted());
break;
}
}
}