public class InterruptTest {
public static void main(String[] args) {
Thread thread=new Thread(){
@Override
public void run() {
while(true){
if(this.isInterrupted()){//判断当前线程是否是中断状态
System.out.println("========true======");
break;
}
}
}
};
thread.start();
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();//调用线程中断方法
}
}
看代码可以发现这与我们自行控制线程的终断类似。
3、当interrupt() 遇到 sleep() / join ()/wait()时 ,在这里以sleep() 为例子
public static native void sleep(long millis) throws InterruptedException;
看源码可知sleep() 方法 InterruptedException 中断异常,该异常不是运行时异常,所以需要捕获它,当线程在执行sleep()时,如果发生线程中断,这个异常就会产生。该异常一旦抛出就会清除中断状态。
看代码:
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(){
@Override
public void run() {
while(true){
System.out.println("线程状态"+this.isInterrupted());
if(Thread.currentThread().isInterrupted()){//判断当前线程是否是中断状态
System.out.println("========true======");
break;
}
try {
Thread.sleep(1000);
System.out.println("===========sleep()结束===========");
} catch (InterruptedException e) {
System.out.println("异常:"+e.getMessage());
// Thread.currentThread().interrupt();
}
}
}
};
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=========interrupt()=============");
thread.interrupt();//调用线程中断方法
}
}
执行结果:
线程状态false
=========interrupt()=============
异常:sleep interrupted
线程状态false
===========sleep()结束===========
线程状态false
===========sleep()结束===========
线程状态false
===========sleep()结束===========
由于线程中断的状态被 InterruptedException 异常清除了,所以if()条件中的状态一直是false ,因此该线程不会被终止。如果去掉注释就可以达到线程终止的目的(再次中断自己,设置中断状态)。