聊聊 interrupt、interrupted 、isInterrupted 的区别

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

前言

相信大家在日常开发的过程中,会经常调用 Thread 类或者 Thread 对象的interrupt、interrupted 、isInterrupted 这三个方法。然而,这三个方法经常容易混淆。今天,我就带大家来一起对它们进行区分。

三者区别

Java 中的线程控制机制是通过 interrupt 和 interrupted 两个方法来实现的。其中 interrupt 是线程的方法,用于向线程发送中断请求;而 interrupted 是线程的静态方法,用于判断线程是否被中断。

interrupt 方法

interrupt是线程的方法,通过该方法可以向线程发送中断请求,表示该线程的工作已经完成。该方法可以用来结束一个正在运行的线程。例如,下面的代码示例向线程发送中断请求:

public class InterruptLearnTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    System.out.println("do some ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        thread.interrupt();
    }
}

运行结果:

image.png

通过运行结果,我们可以看到,线程在 sleep 的过程中被中断了。

interrupted 方法

interrupted 方法是线程的静态方法,用于判断线程是否被中断。例如,下面的代码示例判断线程是否被中断:

class InterruptedLearnTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    System.out.println("do some ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        System.out.println("线程启动了");
        System.out.println(Thread.interrupted());
        System.out.println(Thread.interrupted());
        System.out.println("主线程结束了");

    }
}

输出结果如下:

image.png

通过运行结果,我们可以看到,调用 Thread.interrupted() 方法的返回值一直都是 false,因为该方法是主线程进行调用的,而主线程一直在正常运行中,没有被中断过,所以 Thread.interrupted() 的返回值就一直是false。

image.png 此外,与 isInterrupted 方法不同的是,Thread.interrupted() 方法会清除线程的中断状态,也就是说调用完该方法的线程,会由中断状态转变为其他状态。

isInterrupted 方法

isInterrupted 方法是线程的实例方法,同样用于判断线程是否被中断。例如,下面的代码示例判断线程是否被中断:

class InterruptedLearnTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    System.out.println("do some ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        thread.interrupt();
        System.out.println(thread.isInterrupted());
    }
}

运行结果如下:

image.png

通过运行结果,我们可以看到,调用 thread.interrupt() 方法后,线程中断了,调用 thread.isInterrupted() 方法返回 true。但是,thread.isInterrupted() 不会清除线程的中断标志。