線程中斷并不會(huì)讓線程立即退出,而是給線程發(fā)送一個(gè)通知,告訴目標(biāo)線程,現(xiàn)在希望他退出,至于線程接到通知后如何處理,完全由目標(biāo)線程自己確定.
JDK里面,線程中斷有三個(gè)方法:
public void Thread.interrupt() //中斷線程
public boolean Thread.isInterrupt() //判斷線程是否被中斷
public static boolean Thread.interrupted() //判斷線程是否被中斷,并且清除當(dāng)前中斷狀態(tài)
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(){
@Override
public void run() {
Thread.yield();
}
};
t1.start();
Thread.sleep(2000);
t1.interrupt();
}
此處雖然對(duì)t1進(jìn)行了中斷,但是t1中沒(méi)有任何中斷處理的邏輯代碼,所以這個(gè)中斷不會(huì)有任何左右.
如果希望t1 在中斷后退出,做以下即可
public static void main(String[] args)throws InterruptedException {
Thread t1 = new Thread(){
@Override
public void run() {
while (true){
if (Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().getName());
System.out.println("Interrupt");
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("線程在睡眠時(shí)被中斷");
Thread.currentThread().interrupt();
}
Thread.yield();
}
}
};
t1.start();
Thread.sleep(1000);
t1.interrupt();
}
需要注意的是Thread.sleep(); 會(huì)拋出 InterruptedException 異常 ,此異常不是運(yùn)行時(shí)異常,也就是說(shuō)程序必須捕獲處理它. 當(dāng)程序運(yùn)行被中斷時(shí),System.out.println("線程在睡眠時(shí)被中斷")被執(zhí)行,但是為了保證數(shù)據(jù)完整性,需要再次執(zhí)行Thread.currentThread().interrupt()方法以重置標(biāo)志位,才能再次判斷中斷情況。