【多线程】Thread 方法:interrupt()、isInterrupted()、interrupted() 讲解

前言:

三个方法,都是Thread中定义的方法,其中interrupted()是Thread中的静态方法:
interrupt() : 给调用线程加入一个中断点,但是不会结束此线程。
isInterrupted():返回此线程的中断状态,但是不会移除此线程中断状态。
interrupted():返回的是当前线程的中断状态,会移除当前线程的中断状态

isInterrupted()、interrupted()区别

方法名 返回线程中断状态 是否会移除线程的中断状态 作用范围【重点】
isInterrupted() 调用者线程
interrupted() 当前线程

代码示例

  1. isInterrupted():
public class ThreadTest extends Thread{

    public static void main(String[] args) throws InterruptedException {
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();

        // 1.给threadMethod 线程加入中断点
        threadTest.interrupt();

        // 2. threadTest 线程中断状态
        System.out.println("第一次获取threadTest的线程中断状态:" + threadTest.isInterrupted());
        System.out.println("第二次获取threadTest的线程中断状态:" + threadTest.isInterrupted());
    }

    @Override
    public void run() {
        for (int i =0 ; i<10; i++){
            if(i == 5){
                // 3. 获取到当前对象的线程中断状态
                System.out.println("第一次当前线程中断状态:" + Thread.currentThread().isInterrupted());
                System.out.println("第二次当前线程中断状态:" + Thread.currentThread().isInterrupted());

                // 5.根据中断状态 结束线程
                if (Thread.interrupted()){
                    return;
                }
            }
            System.out.println("i == " + i);
        }
    }
}

打印结果-执行顺序可能不同:

第一次获取threadTest的线程中断状态:true
第二次获取threadTest的线程中断状态:true
i == 0
i == 1
i == 2
i == 3
i == 4
第一次当前线程中断状态:true
第二次当前线程中断状态:true

解析:
代码 1 给 threadTest 加入线程中断状态, 通过被中断的线程对象调用 isInterrupted() 获取到线程的中断状态,代码 2 3 多次获取结果均为 True, 最后通过代码 5 结束正在运行的线程,实现主线程对其他线程的控制。

  1. interrupted() 是 Thread 内置静态方法,调用 Thread.interrupted() :
public class ThreadTest extends Thread{

    public static void main(String[] args) throws InterruptedException {
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();

        // 1.给threadMethod 线程加入中断点
        threadTest.interrupt();

        // 2. threadTest 线程中断状态
        System.out.println("第一次获取main的线程中断状态:" + Thread.interrupted());
        System.out.println("第二次获取main的线程中断状态:" + Thread.interrupted());
    }

    @Override
    public void run() {
        for (int i =0 ; i<10; i++){
            if(i == 5){
                // 3. 获取到当前对象的线程中断状态
                System.out.println("第一次当前线程中断状态:" + Thread.interrupted());
                System.out.println("第二次当前线程中断状态:" + Thread.interrupted());

                // 4.根据中断状态 结束线程
                if (Thread.interrupted()){
                    return;
                }
            }
            System.out.println("i == " + i);
        }
    }
}

打印结果:

第一次获取main的线程中断状态:false
第二次获取main的线程中断状态:false
i == 0
i == 1
i == 2
i == 3
i == 4
第一次当前线程中断状态:true
第二次当前线程中断状态:false
i == 5
i == 6
i == 7
i == 8
i == 9

解析:
代码 1 是给 threadTest 线程加入线程中断状态,代码 2 获得的是当前线程 【main】的中断状态,因此为 false
代码 3 因为 interrupted 会移除线程中断状态,所以第一次返回True 第二次返回 False。
代码 5 interrupted 移除了线程中断状态,因此无法Ruturn

源码:

为什么 两者 之间会有区别那,看看源码变知晓,不过多解释:

// isInterrupted() 返回当前线程中断状态
public boolean isInterrupted() {
        return isInterrupted(false);
 }

// interrupted 获取线程中断状态,并清除
public static boolean interrupted() {
        return currentThread().isInterrupted(true);
}

// 获取当前线程。
public static native Thread currentThread();


 /**
  * 原生方法  获取线程中断状态
   * ClearInterrupted 是否清除中断状态
   */
private native boolean isInterrupted(boolean ClearInterrupted);

注意: 当线程方法wiat、join、sleep三种方法之一,在起作用时,调用它的 interrupte()方法,会生成一个InterruptedException异常,因为没有占用CPU 运行的线程是不可能给自己一个中断状态置位的。

你可能感兴趣的:(#,并发)