![Java多线程编程核心技术(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/42637745/b_42637745.jpg)
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所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/1-39.jpg?sign=1739304561-P4kqKM7KO1Lj1Hb0glo16aWofuNErfhl-0-5d5c1fed4c335bdf35d13d31a874f36e)
图1-39 interrupted方法的声明
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/1-40.jpg?sign=1739304561-9hAXHFZWC8bfy3ktUa1JUb261HAdm7vC-0-1e6628d81544538f14b651a518b17755)
图1-40 isInterrupted方法的声明
这两种方法有什么区别呢?先来看看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!"); } }
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/1-41.jpg?sign=1739304561-CMnzz2Thrj3tUvYQQOSI7HeT9BHtRFhX-0-2fe6a49e0be5e738e696e158e55c34d3)
图1-41 运行结果
程序运行结果如图1-41所示。
类Run.java中虽然是在thread对象上调用代码:
thread.interrupt();
来停止thread对象所代表的线程,在后面又使用代码:
System.out.println("是否停止1?="+thread.interrupted()); System.out.println("是否停止2?="+thread.interrupted());
来判断thread对象所代表的线程是否停止,但从控制台输出的结果来看,线程并未停止,证明了interrupted()方法的解释:测试当前线程是否已经中断。这个当前线程是main,从未中断过,所以输出的结果是两个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所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/1-42.jpg?sign=1739304561-ZSK9wlmXzuxlWKtPH6cTIzmLyBGLeuem-0-9c2b790d3143ebf32b4f01d36ad9fab2)
图1-42 主线程main已是停止状态
从上述结果来看,interrupted()方法的确判断了当前线程是否是停止状态,但为什么第二个Boolean布尔值是false呢? interrupted方法在官方帮助文档中的解释如下:
测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除其中断状态之后,且第二次调用检验完中断状态前,当前线程再次被中断的情况除外)。
文档已经解释得很详细,interrupted()方法具有清除状态的功能,所以第二次调用interrupted()方法返回的值是false。
介绍完interrupted()方法后再来看一下isInterrupted()方法,声明如下:
public boolean isInterrupted()
从声明中可以看出isInterrupted()方法不是静态的,具体取决于调用这个方法的线程对象。
继续创建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所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/1-43.jpg?sign=1739304561-aaW38YpA75hMV7fs69syiP2noJ0HVf4A-0-7413263067c0eeb224d32ca1e226d5c1)
图1-43 已经是停止状态
从结果可以看到,isInterrupted()方法并未清除状态标志,不具有此功能,所以输出两个true。但是也有非常非常小的概率先输出一个false,如中断的标记还未更新。
最后,再来看一下这两种方法的解释。
1)this.interrupted():测试当前线程是否已经是中断状态,执行后具有清除状态标志值为false的功能。
2)this.isInterrupted():测试所在Thread线程对象是否已经是中断状态,不清除状态标志。