线程打断是自我打断
当调用线程的interrupt()
方法时,被打断的线程不会立刻被打断,只是它里面的一个状态被改变.
@Override
public void run() {
//线程被其他线程打断时,但还会一直执行
while (true) {
//true
System.out.println("线程是否被打断:" + this.isInterrupted());
//true
System.out.println("线程确认是否被打断:" + this.isInterrupted());
}
}
interrupted()会使中断状态重置
被中断线程可以通过interrupted()对状态进行检测,如果是被中断状态时,返回true,然后注意,此时的中断状态会被重置到未被打断状态,因此,被中断线程可以通过调用一次该值不做任何处理,让自己不被中断.
@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()方法不会重置清除状态
内部调用本地方法 private native boolean isInterrupted(boolean ClearInterrupted);
参数为false.
而上面的interrupted()方法也是调用了这个本地方法,只不过参数为ture.
InterruptedException异常不代表线程被中断
另外的线程调用一个正在sleep(),或者wait()的线程的interrupt方法时,此时被中断线程会抛出一个异常,说明在休眠的线程中断是会被通知的,且此时的中断状态为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;
}
}
}
网友评论