详解Thread类中interrupt()、interrupted()和isInterrupted()方法的区别

1.从源码分析区别

interrupt()方法

 public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0(); //调用jvm里的JVM_Interrupt方法
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

非静态方法,作用范围线程实例,由线程实例对象调用,其作用是中断此线程实例(注:不一定是当前线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

interrupted()方法

 public static boolean interrupted() {
 	//调用isInterrupted方法,重置了标志位
	return currentThread().isInterrupted(true);
}

静态方法,作用范围当前线程,直接Thread点出来,作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false(换句话说,复位线程状态,如果已经复位,在此复位则返回false)。

isInterrupted()方法

 public boolean isInterrupted() {
        return isInterrupted(false);
    }

非静态方法,作用范围线程实例,由线程实例对象调用,其作用是只测试此线程是否被中断 ,不清除中断状态。

2.从demo上感受区别

demo1:

public static void main(String[] args) throws InterruptedException {

        System.out.println("执行前:" + Thread.currentThread().isInterrupted());
        Thread.currentThread().interrupt();
        System.out.println("执行interrupt()后:" + Thread.currentThread().isInterrupted());
        Thread.interrupted();
        System.out. println("执行第一次interrupted()后:" +Thread.currentThread().isInterrupted());
        Thread.interrupted();
        System.out. println("执行第二次interrupted()后:" +Thread.currentThread().isInterrupted());
    }
    }

执行结果:
详解Thread类中interrupt()、interrupted()和isInterrupted()方法的区别_第1张图片
这个demo在一个线程里表现了三者的区别,
1…isInterrupted(),获取实例对象的中断状态,默认为false
2…interrupt(),设置实例对象的中断状态,由false-》true
3…interrupted(),是个类方法,在当前线程重置中断状态,由true-》false,执行多次效果一样。

demo2:

public static void main(String[] args) throws InterruptedException {
        Thread myThread =new Thread(()->{

        });
        myThread.start();
        myThread.interrupt(); //把isInterrupted设置成true
        Thread.interrupted(); //当前线程(main线程)执行中断恢复
        System.out.println("myThread调用interrupt()之后的状态:" + myThread.isInterrupted());
        System.out.println("当前线程的状态:" + Thread.currentThread().isInterrupted());
    }

执行结果:
详解Thread类中interrupt()、interrupted()和isInterrupted()方法的区别_第2张图片
这个demo表现了interrupt()和interrupted()具体的区别。 myThread.interrupt();是把myThread线程中断了,由false-》true。
Thread.interrupted(); 是当前线程(main线程)执行中断恢复,并不会影响myThread,所以第一次打印的myThread中断状态是true。

你可能感兴趣的:(java并发编程)