interrupt()、interrupted()和isInterrupted()你真的懂了吗

24 篇文章 0 订阅
订阅专栏

         在Java并发编程中,对于线程的Thread类中有这样三个方法:interrupt()方法、interrupted()方法和isInterrupted()方法。那么这三个方法的有啥区别呢?首先看一下对这三个方法的解释:

  • interrupt()方法:表示可以中断线程,实际上只是给线程设置一个中断标志,但是线程依旧会执行。
  • interrupted()方法:Thread类的静态方法。检查当前线程的中断标志,返回一个boolean并清除中断状态,其连续两次调用的返回结果不一样,因为第二次调用的时候线程的中断状态已经被清除,会返回一个false。
  • isInterrupted()方法:测试线程是否被中断,不会清除中断状态。

        下面对这三个方法进行演示和说明:

        首先定义一个线程类,然后在main方法中进行测试,代码如下:

class TestThread extends Thread{
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + "正在打印 i = " + i);
        }
    }
}

public class TestInterrupted {
    public static void main(String[] args) {
        TestThread  mt = new TestThread();
        mt.start();
        mt.interrupt();
        System.out.println("第一次调用isInterrupted()方法,值为:" + mt.isInterrupted());
        System.out.println("第二次调用isInterrupted()方法,值为:" + mt.isInterrupted());
        System.out.println("thread是否存活:" + mt.isAlive());
    }
}

        执行结果如下:

         从结果中可以看出:在调用interrupt()方法之后,线程依旧在执行,并没有停止,因为interrupt()方法只是给线程设置了中断标志而已。其次,两次调用的isInterrupted()方法都输出了true,这也佐证了isInterrupted()方法并不会清除线程的中断状态。

        接下来对代码进行修改,添加interrupted()方法的调用:

public class TestInterrupted {
    public static void main(String[] args) {
        TestThread  mt = new TestThread();
        mt.start();
        mt.interrupt();
        System.out.println("第一次调用isInterrupted()方法,值为:" + mt.isInterrupted());
        System.out.println("第二次调用isInterrupted()方法,值为:" + mt.isInterrupted());
        System.out.println("调用interrupted()方法,值为:" + Thread.interrupted());
        System.out.println("调用interrupted()方法,值为:" +Thread.interrupted());
        System.out.println("thread是否存活:" + mt.isAlive());
    }
}

        执行结果如下:

         从执行结果来看,interrupted()方法的执行结果好像和我们预期的结果不一样。前面提到:interrupted()方法连续两次调用的返回结果不一样,因为第二次调用的时候线程的中断状态已经被清除,会返回一个false。按这个来说的话,这里的执行结果应该是一个true,一个false。

        这里有一个注意点:interrupted()方法测试的是当前线程是否被中断。但是这里的当前线程是main线程,而mt.interrupted()中断的是mt线程,而不是main线程。也就是说,当前线程main并没有被中断过,即Thread.interrupted()方法其实相当于main.interrupted(),而Thread.interrupted()方法检测的是mt线程有没有被中断。

        来看下面的代码:

public class TestInterrupted {
    public static void main(String[] args) {
        Thread.currentThread().interrupt();
        System.out.println("第一次调用isInterrupted()方法,值为:" + Thread.currentThread().isInterrupted());
        System.out.println("调用interrupted()方法,值为:" + Thread.currentThread().interrupted());
        System.out.println("调用interrupted()方法,值为:" +Thread.currentThread().interrupted());
    }
}

        执行结果如下:

         上面都是针对当前线程进行操作,其运行结果也符合我们的预期:true-true-false,因为interrupted()方法是有检测中断并清除中断状态的作用。

        那么,如何才能中断mt线程呢?

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


class TestThread extends Thread{
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + "正在打印 i = " + i);
            if(this.isInterrupted()){//检查中断状态
                System.out.println("通过this.isInterrupted()检测到中断");
                System.out.println("第一个interrupted()"+this.interrupted());
                System.out.println("第二个interrupted()"+this.interrupted());
                break;
            }

        }
        System.out.println("检测到线程中断,线程执行结束");
    }
}

public class TestInterrupted {
    public static void main(String[] args) throws InterruptedException {
        TestThread mt = new TestThread();
        mt.start();
        mt.interrupt();
        Thread.sleep(2000);
        System.out.println("mt线程是否存活:" + mt.isAlive());
    }
}

        执行结果如下:

 总结:

  • interrupt()是给线程设置中断标志
  • interrupted()是检测中断并清除中断状态
  • isInterrupted()只检测中断。
  • 还有一点就是interrupted()作用于当前线程,interrupt()和isInterrupted()作用于此线程,即代码中调用此方法的实例所代表的线程
interrupted()和isInterrupted()详述,【吐血整理】
m0_63102527的博客
11-19 1310
/** 线程是否被中断native方法,ClearInterrupted为是否清除中断标志参数 */ private native boolean isInterrupted(boolean ClearInterrupted); /** 中断当前线程的native方法 */ private native void interrupt0(); ​ interrupted()和isInterrupted()区别 看了上述API讲述和Thread中的源码,已经清楚interrupted()和isInter
isInterruptedinterrupted的区别
qq_45110312的博客
05-28 1377
133
interruptinterrupted 、isInterrupted 区别
热门推荐
z69183787的专栏
05-05 3万+
1、interrupt  interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。
Javainterrupted()与isInterrupted()的区别
最新发布
✨ 欢迎来到【Seal ^_^ 的CSDN博客】!这里是我记录技术心得、分享经验的地方。✨
08-04 3956
Java多线程编程中,`interrupted()`和`isInterrupted()`方法用于检查线程的中断状态,但它们之间存在关键的区别。
java---interruptinterrupted和isInterrupted的区别
weixin_33805557的博客
02-19 245
1、interrupt()  interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。   2、inte...
interrupted() 和 isInterrupted() 的区别
github_34889651的博客
09-08 7569
Thread 类中提供了两种方法用来判断线程的状态是不是停止的。就是我们今天的两位主人公 interrupted() 和 isInterrupted() 。interrupted() 官方解释:测试当前线程是否已经中断,当前线程是指运行 this.interrupted() 方法的线程 。 public class t12 { public static void main(String
interrupt()、interrupted()和isInterrupted()的区别与使用
shadow_zed的博客
06-12 668
interrupt()是给线程设置中断标志 interrupted()是检测中断并清除中断状态 isInterrupted()只检测中断。
简述Thread的interrupt()、interrupted()及isInterrupted()的区别
Huangjiazhen711的博客
10-26 486
java Thread类中,我们会看到interrupt()、interrupted()及isInterrupted(),在大多数情况下,我们都不会使用到它们,但是有一个try {}}那么你知道异常是如何触发的嘛?
多线程细讲-3:轻松理解interrupt(),interrupted(),isInterrupted()方法的作用
m0_72467092的博客
11-05 1160
说到线程的中断,一定离不开三个 方法 interrupt() , interrupted() , isInterrupted() , 本文从源代码入手就能很好地理解这三个方法
JAVA多线程之中断机制stop()、interrupted()、isInterrupted()
09-02
在实际编程中,推荐使用`interrupt()`和`isInterrupted()`/`interrupted()`组合来实现线程的中断处理。例如,一个典型的线程循环可以这样编写: ```java while (!Thread.currentThread().isInterrupted()) { // ...
interruptinterrupted和isInterrupted
Terrence_he的博客
10-18 569
Thread.interrupt Thread.interrupt用来中断当前执行的线程。它并不会像Thread.stop那样直接停止正在运行的线程, 而是设置该线程的中断状态位为true,然后可以在线程里通过interrupted或isinterrupted来判断中断标 从而退出程序执行过程。 interrupted和isinterrupted interrupted和isin
Javainterruptinterrupted和isInterrupted的区别
程序猿开发日志【学习永无止境】
12-05 9752
今天在看到Thread类的isInterrupted方法可以获取线程的中断状态: 于是写了个例子想验证一下: public class Interrupt { public static void main(String[] args) throws Exception { Thread t = new Thread(new Worker()); t.start();
嚼烂interrupt,interrupted和isInterrupted
爱琴孩的博客
11-05 362
前言 前面在讲java中的线程中断机制中,我们提到了用stop和suspend来强制终止线程的不安全性,当时也提到了interrupt方法。这里再和大家一起学习下Java多线程中的interrupt,interrupted和isInterruptedinterrupt的伸冤之路 首先对于interrupt方法,他是用于中断线程的,调用该方法的线程的状态将被置为"中断"状态。注意:线程中断...
Thread类的interrupt(),interrupted(),isInterrupted()
bingjing12345的专栏
03-02 5373
1. sleep() & interrupt() 线程A正在使用sleep()暂停着: Thread.sleep(100000); 如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用 a.interrupt(); 令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例 执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都
线程中断;interrupted 和 isInterrupted 的区别
dl674756321的博客
06-27 908
1. interrupted和isInterrupted的区别 public class s { public static void main(String[] args) throws InterruptedException { Thread threadOne = new Thread(new Runnable() { @Override ...
线程中断机制 interrupt、isInterruptedinterrupted方法
m0_71149992的博客
06-28 1951
①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了②. 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制 — 中断③. 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现④. 若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中
Java多线程基础七——停止线程之:interrupted和isInterrupted的区别和各自的用法总结
Xmumu_的博客
02-17 611
目录简述方法停止不了的线程 简述 停止线程在多线程的开发中是非常重要的一点,掌握这个技术可以对线程的停止进行非常有效的处理。当然了停止线程肯定不会像break那样或者goto那种直接就停止或者跳转,需要一些技巧性的处理。 方法 停止一个线程可以使用Thread.stop()方法,但是最好不要使用,虽然说它可以很快的停止一个正在运行中的线程,但是但是但是这个方法是不安全的,而且是已经被用作废的,并且在未来的Java版本中,很有可能这个方法将不可以使用了或者不被支持 大多数的停止线程操作常用Thread.int
关于interrupt(),interrupted(),isInterrupted()用法分析
卓越无关环境,保持空杯心态——靡不有初,鲜克有终
07-19 9628
我想代码是非常容易解释这个问题的了。下文会给出总结。 总结点击这里或者往下阅读: 直接来一段小代码吧: public class Interrupt { public static void main(String[] args) { Thread t = new Thread(new Worker()); t.start(); t...
interrupted()和isInterrupted()详述
Java框架、并发编程、分布式、微服务、Redis、HarmonyOS、中间件等技术
06-24 445
有经典,有干货,微信搜索【李子捌】关注这个爱好广泛的程序员。 前言 当提及如何终止一个线程时,部分读者通常立马想到的方法肯定是stop(),但是stop()方法并不被推荐使用(很多规范中是禁止使用的),其原因是强制终止一个线程,会导致程序不正常的结束,会出现资源未正确释放、程序结果不正确等等问题。而是否终止一个线程应该把这个控制权转交给当前被终止的线程本身,此时采用的办法就是** **interrupt()方法来终止,该方法相当于修改一个共享变量的值,当运行中的线程判断当前值为false则继续运行,如.
写文章

热门文章

  • 二叉树的五种遍历方式 14603
  • Git回退版本的方式 13271
  • 记录一次华三交换机配置IP地址和SNMP服务的过程 13040
  • Echarts实现动态折线图的定时刷新 8243
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性 7187

分类专栏

  • Java 24篇
  • 网络 1篇
  • Python 2篇
  • 前端 7篇
  • 秋招面试
  • 剑指offer 49篇
  • 算法刷题 29篇
  • Spring学习 13篇
  • redis 8篇
  • shiro 5篇
  • SpringBoot 13篇
  • Spring MVC学习 9篇
  • ssm 6篇
  • git 3篇
  • nginx 5篇
  • Bootstrap 2篇
  • Docker 8篇
  • QT/C++ 1篇
  • MyBatis学习 13篇
  • 设计模式 24篇

最新评论

  • SpringBoot项目在启动后自动关闭

    宇宙无敌油大菜: 太感谢了,学习到了

  • Git回退版本的方式

    longlongfishday: 救我一条狗命了表情包

  • Echarts实现动态折线图的定时刷新

    姚舜禹_12140: 应该是可以的,只要后端能传数

  • Echarts实现动态折线图的定时刷新

    weixin_46610465: 请问如果没有默认数据的话,图表还能实时更新了吗

  • Bootstrap实战之新闻网

    姚舜禹_12140: 怎么给你

大家在看

  • day01|计算机网络重难点之TCP/IP模型和OSI模型的区别、从输入 URL 到页面展示
  • 研发运营一体化(DevOps)能力成熟度模型 223
  • 十八、Python基础语法(元组-tuple) 306
  • 帝国CMS 内容页调用上一篇&下一篇的方法(精华汇总) 1
  • Vite配置打包分类文件 380

最新文章

  • SpringBoot报错:Factory method ‘dataSource‘ threw exception; nested exception is java.lang.NullPointerE
  • SpringBoot+Redis实现接口防刷功能
  • docker学习笔记之Dockerfile
2024年3篇
2023年22篇
2022年59篇
2021年111篇
2020年29篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家四川周年庆典商场美陈报价广东led发光玻璃钢雕塑现货抗日玻璃钢雕塑呼和浩特玻璃钢雕塑定制古代玻璃钢雕塑包括哪些定西城市玻璃钢雕塑价格湖南商场美陈萍乡玻璃钢雕塑生产厂家上海个性化玻璃钢雕塑销售电话铠涵设计玻璃钢雕塑定制北京装饰商场美陈专做室内外玻璃钢人物雕塑苏州玻璃钢雕塑信息推荐宿州仿铜玻璃钢雕塑安装琼海玻璃钢长颈雕塑广东定制玻璃钢卡通雕塑安阳玻璃钢雕塑设计透光玻璃钢雕塑摆件延边玻璃钢雕塑设计云南环保玻璃钢雕塑哪家便宜商场体感互动美陈小型玻璃钢花盆研发韶关陈列性玻璃钢雕塑厂家玻璃钢书雕塑玻璃钢雕塑日常保养与维护信阳卡通玻璃钢雕塑玻璃钢雕塑产业带不锈钢校园玻璃钢雕塑多钱泉州玻璃钢卡通雕塑定制扬州景观灯玻璃钢花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化