Java多线程interrupt、interrupted、isInterrupted详解

news2025/1/16 11:05:57

一、概念

1.1 interrupt方法应用场景

  • 用来打断正在阻塞的线程:sleep/wait/join
  • 打断正常的线程

1.2 interrupt() 方法

        Thread类的实例方法,其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。)作用与正常线程会将中断标记设置为true,但是作用于阻塞线程会将中断标志刷新false(中断标记默认为false,刷新就是重新刷会默认)。

1.3 interrupted() 方法

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

1.4 isInterrupted() 方法

        Thread类的实例方法,作用是只测试此线程是否被中断,不清除中断状态。

二、实例

2.1 打断正常线程,不停止线程

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while (true){
                //让thread线程不断运行
            }
        });
        t.start();
        Thread.sleep(1000);//让主线程睡一会
        t.interrupt();//打断正在正常运行的thread
        System.out.println(t.isInterrupted());
    }
}

程序不会停止

2.2 打断正常线程,并停止线程

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while (Thread.currentThread().isInterrupted()){
                break;
            }
        });
        t.start();
        Thread.sleep(1000);//让主线程睡一会
        t.interrupt();//打断正在正常运行的thread
        System.out.println(t.isInterrupted());
    }
}

程序停止

2.3 阻塞线程打断

作用于阻塞线程会将中断标志刷新false

public static void main(String[] args) throws InterruptedException {
        Thread thread1=new Thread(()-> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        );
        thread1.start();
        thread1.interrupt();
        System.out.println(thread1.isInterrupted());
    }

输出:


        这里我们发现输出的是true!这里不是我们前面的结论,打断阻塞的线程不是刷新打断状态为false吗?这里牵扯到并发于并行的概念,这里从主线程运行,而thread1是主线程下的线程,这里先执行的是interrupt()方法,然后才执行的是sleep方法,所以打断的时候它是正常的线程,打断状态为true。

        如果我们换成下面这些代码则会让thread1先睡眠,后打断,这样就会在睡眠阻塞中被打断那么就会刷新,这样打断位就为false!!

    public static void main(String[] args) throws InterruptedException {
        Thread thread1=new Thread(()-> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        );
        thread1.start();
      Thread.sleep(1000);
        thread1.interrupt();
        System.out.println(thread1.isInterrupted());
    }

        这里我们就是false,因为这里在thread1.interrupt();前让主线程睡一会,让thread1有时间进入到睡眠的状态,这样才会造成我们想要的在睡眠阻塞中打断。

三、两阶段终止设计模式

        这里涉及到在线程T1里如何就“优雅”的终止线程T2(例如上面在主线程中如何优雅终止线程thread)
        优雅:指的不是直接杀死T2,而是给T2一个料理后事的机会。直接杀死不好,stop方法现在也被废弃,就是不让大家直接杀死线程。

public class Demotest {

    public static void main(String[] args) throws InterruptedException {
        ThreadMonitor threadMonitor=new ThreadMonitor();
        threadMonitor.start();
        Thread.sleep(3000);//让主线程睡一会
        threadMonitor.stop();

    }

}
class ThreadMonitor{
    private Thread mnoitor;

    //启动被监控的线程
    public void start(){
        mnoitor=new Thread(()->{
            while (true){
                Thread nowthread=Thread.currentThread();//获取当前线程
                if (nowthread.isInterrupted()){//有被打断则调用stop方法
                    break;
                }
                try {
                    nowthread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    nowthread.interrupt();//设置打断标志为true
                    System.out.println("设置了打断标记");
                }
            }
        });
        mnoitor.start();
    }

    //想要停止线程
    public void stop(){
        mnoitor.interrupt();
    }
}


这里通过监控线程的打断标记来控制线程停止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【手写模拟Spring底层原理】

文章目录 模拟Spring底层详解1、结合配置类,扫描类资源1.1、创建需要扫描的配置类AppConfig,如下:1.2、创建Spring容器对象LyfApplicationContext,如下1.3、Spring容器对象LyfApplicationContext扫描资源 2、结合上一步的扫描&…

oracle11G在linux环境下的卸载操作

1.使用SQL*PLUS停止数据库 [oracleOracleTest oracle]$ sqlplus / as sysdba SQL> shutdown [immediate] SQL> exit2.停止Listener [oracleOracleTest oracle]$ lsnrctl stop3.停止HTTP服务 [rootOracleTest /root]# service httpd stop4.用su或者重新登录到root(如想…

bootstrap-fileinput拦截文件上传处理失败,根据后台返回数据处理

bootstrap-fileinput如何拦截后台数据,自定义处理业务逻辑 需要后台返回error字段,失败示例,注意:error必须有内容,不然默认也是成功, bootstrap-fileinput失败验证只需要 error 字段,其他附加…

【MySQL习题】各个视频的平均完播率【全网最详细教学】

目录 数据表描述 问题描述 输出示例 解题思路【重点】 正解代码 数据表描述 有以下两张表: 表1:用户-视频互动表tb_user_video_log 数据举例: 说明: uid-用户ID,video_id-视频ID start_time-开始观看时间end_time-结束观…

微信小程序报request:fail url not in domain list的解决方法

情况1:未设置合法域名 解决方法:请在微信公众平台登录小程序后台 > 开发管理 > 开发设置 > 服务器域名 情况2:设置了合法域名,开发工具仍然报错 解决方法: 在右上角点击详情,之后刷新一下项目配置,看看有…

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的: 单链表如何解决顺序表中的问题: 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

容器数据卷+MYSQL实战

什么是容器数据卷? 让我们回忆一下docker理念: 就是将应用和环境打包成一个镜像 数据? 如果数据都在容器中,那么我们删除容器,数据就会丢失 !需求:数据持久化就完美了 对于MYSQL&#xff0…

玄子Share-Git 入门手册

玄子Share-Git 入门手册 简单介绍 Git Git 是一个自由和开源的分布式版本控制系统,旨在快速和高效地处理从小型到大型的所有项目 Git 简单易学,占用空间小,性能快如闪电。它比Subversion、CVS、Perforce和ClearCase等SCM工具更有优势&…

python默认的输入类型是字符串,怎样转换为其他的类型

在Python中,默认的输入类型是字符串(str类型)。无论你输入的是数字、字符还是其他类型的内容,input函数都会将其作为字符串处理并返回。 如果需要将字符串转换为其他类型(如整数、浮点数等),可…

kafka和rocketMq的区别

kafka topic 中每一个分区会有 Leader 与 Follow。Kafka 的内部机制可以保证 topic 某一个分区的 Leader 与 Follow 不在同一台机器上 Leader 节点承担一个分区的读写,Follow 节点只负责数据备份 如果 Leader 分区所在的 Broker 节点宕机,会触发主从节…

Linux 的热插拔机制通过 Udev(用户空间设备)实现、守护进程

一、Udev作用概述 udev机制简介udev工作流程图 二、Linux的热拔插UDEV机制 三、守护进程 守护进程概念守护进程在后台运行基本特点 四、守护进程和后台进程的区别 一、Udev作用概述 udev机制简介 Udev(用户空间设备)是一个 Linux 系统中用于动态管…

玄子Share-HTML5知识手册

玄子Share-HTML5知识手册 前言: 这一版 HTML 笔记,算是我写的第四版了,第三版对照课本编写,第四版则是对照 MDN 官方文档编写,不论是术语亦或专业性,都更上一层 文章依托 MDN 文档,拓展了大量课…

【2023-11-09】git使用随记——gitignore文件配置某些文件忽略

git使用随记——gitignore文件配置某些文件忽略 通过git进行版本控制在项目中是非常常见的,一些项目构建上的文件通常是不需要进行版本控制的,也就无需推送到git仓库中,比如前端项目中的node_module目录。提供配置.gitignore文件 但是某些情…

腾讯云88,阿里云99,现在都这么卷了吗?!

你是否曾经想过,云服务器的价格竟然可以如此亲民?现在,腾讯云和阿里云竟然都推出了超低价位的云服务器,只要88元和99元!这让我们这些自媒体人、创业者、开发者等都感到非常惊喜。可以看一下配置和价格: 可…

MATLAB中Line 属性说明

目录 颜色和样式 位置 Line 属性是注释线条的外观和行为。 Line 属性控制 Line 对象的外观和行为。通过更改属性值,可以修改线条的特定方面。使用圆点表示法查询和设置属性。 h annotation("line"); c h.Color; h.Color "red"; 颜色和样…

边缘计算如何改变数据存储?

边缘计算在整个价值链中提供多种优势——从降低成本到提高效率再到安全数据传输。该技术允许在源头收集和分析相关数据,这有助于减少延迟和带宽成本,同时显著提高计算过程的冗余系数和效率。 通过降低数据传输成本和损失,边缘计算帮助企业实现…

docker更改存储目录原因及方案

为什么一定要将docker的存储目录挂载到其他目录 docker在安装时默认存储目录在/var/lib/docker,而该目录是在系统盘下的。docker安装后,会使用各种各样的镜像,动辄几个G,那么如此多的镜像文件,装着装着系统盘就撑爆了…

【AI】自回归 (AR) 模型使预测和深度学习变得简单

自回归 (AR) 模型是统计和时间序列模型,用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域,包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关,这使得它们可用于建模和预测时…

【Unity细节】Unity中的Transform.SetParent还有你不知道的细节

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

除了鲁大师,你还可以装这些。

无论是专业的电脑维护人员,还是只是一个简单的 DIY 兴趣爱好者,有的时候都会或多或少遇到一些电脑硬件的问题。 这种情况下,如果特地去安装一款专门的检测软件,肯定会非常麻烦。 一般来说,检测电脑硬件,使…