Thread的interrupt机制

线程打断是自我打断

当调用线程的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;
            }
        }
    }

参考:https://blog.csdn.net/hayre/article/details/52957580

你可能感兴趣的:(Thread的interrupt机制)