首先看看官方说明:

interrupt()方法

其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

interrupted()方法

作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false。

isInterrupted()方法

作用是只测试此线程是否被中断 ,不清除中断状态。

下面我们进行测试说明:

定义一个MyThread类,继承Thread,如下:

public class MyThread extends Thread {@Overridepublic  void run() {for (int i = 0; i < 10; i++) {System.out.println("i="+(i+1));}}
}

在main方法中测试:

public class Do {public static void main(String[] args ) {MyThread thread=new MyThread();thread.start();thread.interrupt();System.out.println("第一次调用thread.isInterrupted():"+thread.isInterrupted());System.out.println("第二次调用thread.isInterrupted():"+thread.isInterrupted());System.out.println("thread是否存活:"+thread.isAlive());}
}

输出如下:

从结果可以看出调用interrupt()方法后,线程仍在继续运行,并未停止,但已经给线程设置了中断标志,两个isInterrupted()方法都会输出true,也说明isInterrupted()方法并不会清除中断状态。

下面我们把代码修改一下,多加两行调用interrupted()方法:

public class Do {public static void main(String[] args ) {MyThread thread=new MyThread();thread.start();thread.interrupt();System.out.println("第一次调用thread.isInterrupted():"+thread.isInterrupted());System.out.println("第二次调用thread.isInterrupted():"+thread.isInterrupted());//测试interrupted()函数System.out.println("第一次调用thread.interrupted():"+thread.interrupted());System.out.println("第二次调用thread.interrupted():"+thread.interrupted());System.out.println("thread是否存活:"+thread.isAlive());}
}

输出如下:

从输出结果看,可能会有疑惑,为什么后面两个interrupted方法输出的都是false,而不是预料中的一个true一个false?注意!!!这是一个坑!!!上面说到,interrupted()方法测试的是当前线程是否被中断,当前线程!!!当前线程!!!这里当前线程是main线程,而thread.interrupt()中断的是thread线程,这里的此线程就是thread线程。所以当前线程main从未被中断过,尽管interrupted()方法是以thread.interrupted()的形式被调用,但它检测的仍然是main线程而不是检测thread线程,所以thread.interrupted()在这里相当于main.interrupted()。对于这点,下面我们再修改进行测试。

Thread.currentThread()函数可以获取当前线程,下面代码中获取的是main线程

public class Do {public static void main(String[] args ) throws InterruptedException {Thread.currentThread().interrupt();System.out.println("第一次调用Thread.currentThread().interrupt():"+Thread.currentThread().isInterrupted());System.out.println("第一次调用thread.interrupted():"+Thread.currentThread().interrupted());System.out.println("第二次调用thread.interrupted():"+Thread.currentThread().interrupted());}
}

这里都是针对当前线程在操作,如果interrupted()方法有检测中断并清除中断状态的作用,预料中的输出应该是true-true-false,实际输出如下:

结果证明猜想是正确的。

若果想要是实现调用interrupt()方法真正的终止线程,则可以在线程的run方法中做处理即可,比如直接跳出run()方法使线程结束,视具体情况而定,下面是一个例子。

修改MyThread类:

public class MyThread extends Thread {@Overridepublic  void run() {for (int i = 0; i < 1000; i++) {System.out.println("i="+(i+1));if(this.isInterrupted()){System.out.println("通过this.isInterrupted()检测到中断");System.out.println("第一个interrupted()"+this.interrupted());System.out.println("第二个interrupted()"+this.interrupted());break;}}System.out.println("因为检测到中断,所以跳出循环,线程到这里结束,因为后面没有内容了");}
}

测试MyThread:

public class Do {public static void main(String[] args ) throws InterruptedException {MyThread myThread=new MyThread();myThread.start();myThread.interrupt();//sleep等待一秒,等myThread运行完Thread.currentThread().sleep(1000);System.out.println("myThread线程是否存活:"+myThread.isAlive());}
}

结果:

最后总结,关于这三个方法,interrupt()是给线程设置中断标志;interrupted()是检测中断并清除中断状态;isInterrupted()只检测中断。还有重要的一点就是interrupted()作用于当前线程,interrupt()和isInterrupted()作用于此线程,即代码中调用此方法的实例所代表的线程。

Thread类中interrupt()、interrupted()和isInterrupted()方法详解相关推荐

  1. python怎么横着输出_对python3中, print横向输出的方法详解

    对python3中, print横向输出的方法详解 Python 2 : print打印的时候,如果结尾有逗号,打出来时候不会换行.但是在python3里面就不行了. Python3: 3.0的pri ...

  2. vue ajax highcharts,在vue项目中引入highcharts图表的方法(详解)

    npm进行highchars的导入,导入完成后就可以进行highchars的可视化组件开发了 npm install highcharts --save 1.components目录下新建一个char ...

  3. Linux中history历史命令使用方法详解

    在/etc/profile里添加如下:#History export HISTTIMEFORMAT="[%F %T]" HISTDIR=/home/common/.hist if ...

  4. php中读取大文件实现方法详解

    php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...

  5. python支持向量机回归_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  6. python更新数据库表的时间字段_python更新数据库中某个字段的数据(方法详解)

    连接数据库基本操作,我把每一步的操作是为什么给大家注释一下,老手自行快进. 请注意这是连接数据库操作,还不是更新. import pymysql #导包 #连接数据库 db = pymysql.con ...

  7. linux ipset 流量,linux中ipset命令的使用方法详解

    linux中ipset命令的使用方法详解 发布时间:2020-10-25 17:07:19 来源:脚本之家 阅读:97 作者:lijiaocn 栏目:服务器 ipset介绍 iptables是在lin ...

  8. python中验证码连通域分割的方法详解

    python中验证码连通域分割的方法详解 这篇文章主要给大家介绍了关于python中验证码连通域分割的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需 ...

  9. python中update是啥意思_python中update的基本使用方法详解

    前言 Python 字典 update()方法用于更新字典中的键/值对,可以修改存在的键对应的值,也可以添加新的键/值对到字典中. 语法格式 d.update(e) 参数说明 将e中键-值对添加到字典 ...

  10. python中search用法_Python中的python re.search方法详解

    re.search扫描整个字符串并返回第一个成功的匹配,若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个 ...

最新文章

  1. python导入模块快捷键_Python中的模块导入和读取键盘输入的方法
  2. 看看那些令人惊艳的入库方案
  3. 日期类型存储成字符串类型的格式问题
  4. Docker之几种storage-driver比较
  5. 【Postgresql】use
  6. [css] 你有用过clip-path吗?说说你对它的理解和它都有哪些运用场景?
  7. [设计模式] ------ 策略模式
  8. 5.微服务:从设计到部署 --- 事件驱动数据管理
  9. JAVA核心技术卷1 corejava.zip 下载地址
  10. Win10打开nvidia控制面板闪退怎么解决
  11. 单片机c语言灯开关程序,使用单片机模拟开关灯的电路图和资料及源代码概述...
  12. halcon修改图像的灰度值02
  13. Cobal Strike的学习与使用
  14. 自学Java day12 使用jvav实现链表 从jvav到架构师
  15. java sequencer_UVM学习笔记--sequence和sequencer(转)
  16. CVPR2022 | 重新审视池化:你的感受野不是最理想的
  17. 如何实现今日头条跳转到微信?
  18. 【android studio】安卓实现mysql数据库登录、注册、重置密码。
  19. win10分屏设置壁纸+获取win10锁屏壁纸
  20. 你觉得学 Python 还是 Java 更好找工作?

热门文章

  1. 基于Python实现的CTF Crypto加密解密工具
  2. python正则匹配两个字符之间的内容(转自:小晓酱手记)
  3. 非常有特色的QQ符号图形
  4. go基础第一遍学习(李文周博客)
  5. 双眼皮壁纸小程序源码-基于WordPress开发-可二开无授权
  6. 股票交易系统接口设计
  7. Python图片转字符画,太好玩啦(46)
  8. python3安装包命令_pip3安装和卸载以及常用命令
  9. hdu-1173采矿
  10. Flex SDK 安装和使用