Java thread.isInterrupted() 返回值不确定结果分析解决
作者:爱吃南瓜糕的北络 发布时间:2023-11-09 19:27:09
一、代码
先上代码(以下这段代码会有多种执行结果)
@Test
public void test_interrupted_thread() throws Exception {
InterruptThread interruptThread = new InterruptThread();
interruptThread.start();
interruptThread.interrupt();
System.out.println("interruptThread.isInterrupted():" + interruptThread.isInterrupted());
}
public class InterruptThread extends Thread {
@Override
public void run() {
for (int i=0; i< 3; i++) {
System.out.println("i=" + (i + 1));
}
System.out.println("【InterruptThread】结束");
}
}
执行结果1:
i=1
i=2
i=3
【Thread-0】【InterruptThread】结束
【main】interruptThread.isInterrupted():false
执行结果2:
【main】interruptThread.isInterrupted():true
i=1
i=2
i=3
【Thread-0】【InterruptThread】结束
执行结果3:
i=1
i=2
i=3
【Thread-0】【InterruptThread】结束
【main】interruptThread.isInterrupted():true
二、分析结果
执行结果1:
Main线程调用了interruptThread.start();,interruptThread线程启动,执行了interruptThread线程内容,同时Main线程调用了interruptThread.interrupt();,设定了interruptThread线程中断标记为true,最后InterruptThread结束,清除中断标记,Main线程调用interruptThread.isInterrupted() 获取interruptThread线程中断标记为false。
执行结果2:
Main线程调用了interruptThread.start();,interruptThread线程启动,但是由于CPU随机调度,在执行了interruptThread线程内容前,先执行Main线程调用interruptThread.interrupt();,设定了interruptThread线程中断标记为true,且先调用interruptThread.isInterrupted()获取interruptThread线程中断标记为true并输出,最后在执行interruptThread线程内容。
执行结果3:
Main线程调用了interruptThread.start();,interruptThread线程启动,执行了interruptThread线程内容,同时Main线程调用了interruptThread.interrupt();,设定了interruptThread线程中断标记为true,最后InterruptThread结束,但是Main线程调用interruptThread.isInterrupted() 获取interruptThread线程中断标记为true。(与执行结果1执行顺序一致,但是最终结果不一致)
原因分析:
Main线程调用interruptThread.interrupt()后立即调用interruptThread.isInterrupted(),虽然interruptThread执行结束,但有可能在interruptThread线程还未完成清除打断标记就Main线程就查看打断标记,此时仍然为true。
三、解决方案
如果Main线程要得到稳定的false,即重置打断标记后的结果,有如下方案:
(1)需要Main线程在调用interruptThread.interrupt();,对Main线程sleep一会,给点时间,再通过调用interruptThread.isInterrupted()获取interruptThread线程的中断状态。
@Test
public void test_interrupted_thread() throws Exception {
InterruptThread interruptThread = new InterruptThread();
interruptThread.start();
interruptThread.interrupt();
Thread.sleep(100);
System.out.println("【" + Thread.currentThread().getName() + "】" + "interruptThread.isInterrupted():" + interruptThread.isInterrupted());
}
(2)也可以通过Main线程调用interruptThread.join(),让Main线程等到interruptThread执行直到中止后再调用interruptThread.isInterrupted()获取interruptThread线程的中断状态。
@Test
public void test_interrupted_thread() throws Exception {
InterruptThread interruptThread = new InterruptThread();
interruptThread.start();
interruptThread.interrupt();
interruptThread.join();
System.out.println("【" + Thread.currentThread().getName() + "】" + "interruptThread.isInterrupted():" + interruptThread.isInterrupted());
}
来源:https://blog.csdn.net/weixin_37585619/article/details/125674488


猜你喜欢
- 一、背景在Idea中有些文件无需与远程git库同步,仅是本地使用,比如*.iml 、.idea(文件夹)等。如果不进行设置,那么每次提交列表
- 本文实例讲述了Java基于socket实现简易聊天室的方法。分享给大家供大家参考。具体实现方法如下:chatroomdemo.javapac
- 扫雷游戏,大家都应该玩过吧!其实规则也很简单,可是我们想自己实现一个扫雷,我们应该怎么做呢?Step1: 知晓游戏原理扫雷就是要把所有非地雷
- 本文实例讲述了C#实现AddRange为数组添加多个元素的方法。分享给大家供大家参考。具体实现方法如下:ArrayList ab = new
- 本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下:很久不用OpenGL ES绘图,怕自己忘记了,于是重
- 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间
- 使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找
- list stream: reduce的使用stream 中的 reduce 的主要作用就是stream中元素进行组合,组合的方式可以是加减
- maven 文件打包,输入 :package -Dmaven.test.skip=true 进行打包, 一般生成的jar 文件 名称是项目名
- C#Process OutputDataReceived事件不触发问题描述项目需要用cmd调用其它软件,实时获取软件处理结果,并根据获取到的
- Spring security记住我基本原理:登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFil
- 前言本文主要给大家介绍了关于Spring Boot集成之异步调用Async的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细
- 1.为项目添加POIPOI官网链接点进去之后下载(上边的是编译好的类,下边的是源代码) 解压文件夹,把下面三个文件复制到WebCo
- 本文实例为大家分享了Java使用poi操作excel的具体代码,供大家参考,具体内容如下依赖poi的jar包,pom.xml配置如下:<
- 我们知道hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就
- 1.Maven依赖<!-- Kettle --><dependency> <grou
- 1、环境搭建创建一个SpringBoot项目,普通的web项目就可以了,我这里使用的是start.aliyun引入依赖:(1)老演员了不多说
- 我先说说这两种的方式的不同之处吧 第一种: 在调动成功之后 不会让你指纹解锁 而是调转到当初你设置指纹解锁时的 手势解锁页面 第二种: 在调
- 一、技术介绍1.chatgpt-java是一个OpenAI的Java版SDK,支持开箱即用。目前以支持官网全部Api。支持最新版本GPT-3
- 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转