《Java多线程编程核心技术(第2版)》 —1.11.2 判断线程是否为停止状态

举报
华章计算机 发表于 2020/02/08 15:08:17 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.11.2节,作者是高洪岩。

1.11.2 判断线程是否为停止状态

在学习如何停止线程之前,先来看一下如何判断线程的状态已经是停止的。在Java的SDK中,Thread.java类提供了两个判断方法。

1)public static boolean interrupted():测试currentThread()是否已经中断。

2)public boolean this.isInterrupted():测试this关键字所在类的对象是否已经中断。

其中,interrupted()方法的声明如图1-39所示。isInterrupted()方法的声明如图1-40所示。

 image.png

这两个方法可以判断线程是否是停止状态,那么这两个方法有什么区别呢?先来看看方法this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。为了对此方法有更深入的了解,创建项目,名称为t12,类MyThread.java代码如下:

public class MyThread extends Thread {

    @Override

    public void run() {

        super.run();

        for (int i = 0; i < 500000; i++) {

            System.out.println("i=" + (i + 1));

        }

    }

}

类Run.java代码如下:

public class Run {

    public static void main(String[] args) {

        try {

            MyThread thread = new MyThread();

            thread.start();

            Thread.sleep(1000);

            thread.interrupt();

            //Thread.currentThread().interrupt();

            System.out.println("是否停止1?="+thread.interrupted());

            System.out.println("是否停止2?="+thread.interrupted());

        } catch (InterruptedException e) {

            System.out.println("main catch");

            e.printStackTrace();

        }

        System.out.println("end!");

    }

}

程序运行结果如图1-41所示。

image.png

Run.java类虽然通过在thread对象上调用代码:

thread.interrupt();

来停止thread对象所代表的线程,在后面又使用代码:

System.out.println("是否停止1?="+thread.interrupted());

System.out.println("是否停止2?="+thread.interrupted());

来判断thread对象所代表的线程是否停止,但从控制台输出的结果来看,线程并未停止,这也证明了interrupted()方法的解释:测试当前线程是否已经中断。这个“当前线程”是main,从未中断过,所以输出的结果是2个false。

测试代码中使用thread.interrupted()来判断currentThread()是否被中断,也可以使用代码Thread.interrupted()判断,因为在Thread.java类中调用静态static方法时,大多数是针对currentThread()线程进行操作的。

如何使main线程有中断效果呢?创建Run2.java,代码如下:

public class Run2 {

    public static void main(String[] args) {

        Thread.currentThread().interrupt();

        System.out.println("是否停止1?=" + Thread.interrupted());

        System.out.println("是否停止2?=" + Thread.interrupted());

        System.out.println("end!");

    }

}

程序运行结果如图1-42所示。

image.png

从上述结果来看,interrupted()方法的确判断了当前线程是否是停止状态,但为什么第二个布尔值是false呢?查看一下interrupted()方法在官方帮助文档中的解释:

测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

文档已经解释得很详细,interrupted()方法具有清除状态的功能,所以第二次调用interrupted()方法返回的值是false。

isInterrupted()方法的声明如下:

public boolean isInterrupted()

从声明中可以看出isInterrupted()方法不是static()方法,作用于调用这个方法的对象。

继续创建Run3.java类,代码如下:

public class Run3 {

    public static void main(String[] args) {

        try {

            MyThread thread = new MyThread();

            thread.start();

            Thread.sleep(1000);

            thread.interrupt();

            System.out.println("是否停止1?="+thread.isInterrupted());

            System.out.println("是否停止2?="+thread.isInterrupted());

        } catch (InterruptedException e) {

            System.out.println("main catch");

            e.printStackTrace();

        }

        System.out.println("end!");

    }

}

程序运行结果如图1-43所示。

image.png

从结果中可以看到,isInterrupted()方法并未清除状态标志,不具有此功能,所以输出两个true。

综上所述,这两个方法的区别如下。

1)this.interrupted():测试当前线程是否已经是中断状态,执行后具有清除状态标志值为false的功能。

2)this.isInterrupted():测试线程Thread对象是否已经是中断状态,不清除状态标志。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。