|
|
51CTO旗下网站
|
|
移动端

1.7.2 判断线程是否是停止状态

《Java多线程编程核心技术》第1章Java多线程技能,本章介绍了Thread类的API,在使用这些API的过程中,会出现一些意想不到的情况,其实这也是多线程具有不可预知性的一个体现。学习和掌握这些常用情况,也就掌握了多线程开发的命脉与习性,是学习多线程更深层知识的基础。本节为大家介绍判断线程是否是停止状态。

作者:高洪岩来源:机械工业出版社|2015-06-19 21:08

1.7.2 判断线程是否是停止状态

在介绍如何停止线程的知识点前,先来看一下如何判断线程的状态是不是停止的。在Java的SDK中,Thread.java类里提供了两种方法。

1)this.interrupted():测试当前线程是否已经中断。

2)this.isInterrupted():测试线程是否已经中断。

interrupted()方法的声明如图1-30所示。

isInterrupted ()方法的声明如图1-31所示。

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

  1. public class MyThread extends Thread {  
  2.     @Override  
  3.     public void run() {  
  4.         super.run();  
  5.         for (int i = 0; i < 500000; i++) {  
  6.             System.out.println("i=" + (i + 1));  
  7.         }  
  8.     }  

类Run.java代码如下:

  1. public class Run {  
  2.     public static void main(String[] args) {  
  3.         try {  
  4.             MyThread thread = new MyThread();  
  5.             thread.start();  
  6.             Thread.sleep(1000);  
  7.             thread.interrupt();  
  8.             //Thread.currentThread().interrupt();  
  9.             System.out.println("是否停止1?="+thread.interrupted());  
  10.             System.out.println("是否停止2?="+thread.interrupted());  
  11.         } catch (InterruptedException e) {  
  12.             System.out.println("main catch");  
  13.             e.printStackTrace();  
  14.         }  
  15.         System.out.println("end!");  
  16.     }  

程序运行后的结果如图1-32所示。

类Run.java中虽然是在thread对象上调用以下代码:

  1. thread.interrupt(); 

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

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

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

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

  1. public class Run2 {  
  2.     public static void main(String[] args) {  
  3.         Thread.currentThread().interrupt();  
  4.         System.out.println("是否停止1?=" + Thread.interrupted());  
  5.         System.out.println("是否停止2?=" + Thread.interrupted());  
  6.         System.out.println("end!");  
  7.     }  

程序运行后的效果如图1-33所示。

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

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

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

介绍完interrupted()方法后再来看一下isInterrupted()方法,声明如下:

  1. public boolean isInterrupted() 

从声明中可以看出isInterrupted()方法不是static的。

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

  1. public class Run3 {  
  2.     public static void main(String[] args) {  
  3.         try {  
  4.             MyThread thread = new MyThread();  
  5.             thread.start();  
  6.             Thread.sleep(1000);  
  7.             thread.interrupt();  
  8.             System.out.println("是否停止1?="+thread.isInterrupted());  
  9.             System.out.println("是否停止2?="+thread.isInterrupted());  
  10.         } catch (InterruptedException e) {  
  11.             System.out.println("main catch");  
  12.             e.printStackTrace();  
  13.         }  
  14.         System.out.println("end!");  
  15.     }  

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

从结果中可以看到,方法isInterrupted()并未清除状态标志,所以打印了两个true。

***,再来看一下这两个方法的解释。

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

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

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

SUN Solaris 9/10系统管理员认证指南

本书专门根据SUN官方的SCSA for Solaris 9&10考试大纲撰写而成,全面覆盖了SCSA for Solaris 9/10的认证考点,除此之外本书还有大量的非考...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客