【JUC】中断机制(interrupt,interrupted,isInterrupted)

2023-10-14 15:44

本文主要是介绍【JUC】中断机制(interrupt,interrupted,isInterrupted),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

中断机制

文章目录

  • 中断机制
    • 1. 概述
    • 2. 三大方法
    • 3. 中断运行中的线程的方式

1. 概述

首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运。所以Thread.stop,Thread.suspend,Thread.resume 都已经被废弃了

其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制一一中断,也即中断标识协商机制。

中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程请求这条线程中断,此时究竟该做什么需要你自己写代码实现。

每个线程对象中都有一个中断标识位,用于表示线程是否被中断,该标识位为true表示中断,为false表示未中断:通过调用线程对象的interrupt方法将该线程的标识位设为true; 可以在别的线程中调用,也可以在自己的线程中调用。

2. 三大方法

方法内容
public void interrupt()实例方法,仅仅是设置线程的中断状态为true,发起一个协商而不会立即停止线程
public static boolean interrupted()判断线程是否被中断并清除当前中断状态,会将中断状态置为false
public boolean isInterrupted()判断当前线程是否被中断(通过检查中断标志位)

当对一个线程调用interrupt()时

  1. 如果线程处于正常活动状态,那么会将该线程的中断标志设置为true,仅此而已
  2. 如果线程处于被阻塞状态(例如处于sleep,wait,join等状态),在别的线程中调用当前线程对象的interrupt方法,线程会立即退出被阻塞状态,并抛出一个InterruptedException异常

public static boolean interrupted(),底层调用的是isInterrupted(true);//会清除当前中断状态

public boolean isInterrupted(),底层调用的是isInterrupted(false);

3. 中断运行中的线程的方式

  1. 通过volatile变量实现
  2. 通过AtomicBoolean实现
  3. 通过Thread类自带的中断api实例方法实现

实现方式:在需要中断的线程中不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑停止线程

public static volatile boolean flag = false;public static void main(String[] args) {new Thread(() -> {while (true) {// 不断监听flagif (flag) {System.out.println("结束线程执行:" + Thread.currentThread().getName());// 一旦发生中断,就执行相应的中断处理业务逻辑停止线程break;}System.out.println("线程跑起来!");}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {flag = true;System.out.println("修改flag完毕");}).start();
}

这篇关于【JUC】中断机制(interrupt,interrupted,isInterrupted)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211484

相关文章

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、