Java 中的线程中断

    • 1、什么是线程中断
    • 2、如何触发线程中断
    • 3、如何处理线程中断
      • 3.1 线程中断相关的核心方法
      • 3.2 处理中断的典型方式
      • 3.3 注意事项
    • 4、线程中断与线程终止的区别
    • 5、线程中断的应用场景
      • 5.1 长时间运行任务的取消
      • 5.2 阻塞操作的快速响应
      • 5.3 服务或线程池的优雅关闭
      • 5.4 超时控制
      • 5.5 事件驱动架构
    • 6 线程中断的常见问题

本篇文章将详细介绍什么是线程中断、如何触发线程中断、如何处理线程中断、线程中断与线程终止的区别 以及线程中断的应用场景。

1、什么是线程中断

Java线程中断是一种线程间协作机制,用于通知线程应在合适的时候停止当前任务。中断并非强制终止线程,而是通过设置线程的中断标志位,由线程自身检查并决定如何处理。

2、如何触发线程中断

  • 使用 Thread.interrupt() 方法
    该方法向目标线程发送中断信号,设置其中断标志位为true。若线程处于阻塞状态(如wait()、sleep()),会抛出InterruptedException并清除中断标志。

  • 如果任务通过线程池submit()方法提交到线程池中执行,可使用 Future.cancal(true) 发送中断信号
    Future.cancal(true) 会获取到 阻塞在 Future.get() 的线程实例,然后调用 thread.interrupt() 方法。

3、如何处理线程中断

3.1 线程中断相关的核心方法

  1. interrupt()
    向目标线程发送中断信号,设置其中断标志位为true。若线程处于阻塞状态(如wait()sleep()),会抛出InterruptedException并清除中断标志。

  2. isInterrupted()
    检查线程的中断标志位状态,不会清除标志位。

  3. Thread.interrupted()
    静态方法,检查当前线程的中断状态并清除标志位(即重置为false)。

3.2 处理中断的典型方式

响应中断的阻塞操作
当线程调用如sleep()wait()等方法时,需捕获InterruptedException并恢复中断状态(避免吞没中断信号),因为 InterruptedException 会清除中断状态:

try {Thread.sleep(1000);
} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新设置中断标志// 执行清理或退出逻辑
}

主动检查中断状态
通过循环中检查isInterrupted()实现协作式终止:

while (!Thread.currentThread().isInterrupted()) {// 执行任务逻辑
}

3.3 注意事项

  • 不可逆性:抛出InterruptedException后中断标志会被清除,需手动恢复。
  • 非强制终止:线程可以忽略中断,但通常不推荐。
  • 资源清理:应在中断处理中释放资源(如关闭文件、网络连接)。

4、线程中断与线程终止的区别

  • 线程中断:是线程间协作机制,不强制终止线程的执行,依赖线程自身响应。
  • 强制终止(已废弃的stop():直接终止线程,可能导致资源未释放或数据不一致,不推荐使用。

5、线程中断的应用场景

5.1 长时间运行任务的取消

当线程执行耗时操作(如I/O阻塞、复杂计算)时,外部可通过中断信号请求终止任务。例如:

Thread worker = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) { // 当收到中断信号时退出循环// 执行任务逻辑}
});
worker.start();
worker.interrupt(); // 发起中断请求

5.2 阻塞操作的快速响应

线程在Object.wait()Thread.sleep()、或BlockingQueue.take()等阻塞方法时,调用interrupt()会抛出InterruptedException,立即终止等待状态:

try {Thread.sleep(1000);
} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 恢复中断状态// 清理资源
}

5.3 服务或线程池的优雅关闭

线程池通过中断所有工作线程实现关闭。ExecutorService.shutdownNow()内部会遍历线程并调用interrupt(),任务需检查中断状态主动退出。

5.4 超时控制

结合Future.cancel(true),可中断正在执行的异步任务。若任务未响应中断,超时后仍可能继续占用资源。

5.5 事件驱动架构

在生产者-消费者模型中,中断可用于紧急停止消费者线程。例如当系统内存不足时,中断日志写入线程避免OOM。

6 线程中断的常见问题

为什么发送线程中断后我的线程还在执行?
调用 interrupt 只是在线程中设置一个标记,并不会强制终止线程。如果线程执行的代码逻辑中没有 Thread.currentThread().isInterrupted()Thread.interrupted() 的检测逻辑和退出语句则线程执行不会受到任何影响。

为什么我无法检测到线程中断?
需要注意 抛出的 InterruptedException 异常和调用 Thread.interrupted() 会清除中断状态,之后判断线程的中断状态则是 false。正确的做法是使用 Thread.currentThread().interrupt(); 重新设置中断状态,后续逻辑才能继续判断是否中断。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode题解】LeetCode 33. 搜索旋转排序数组

【题目链接】 33. 搜索旋转排序数组 【题目描述】 【题解】 对于一个有序数组,我们可以使用二分查找算法来查找某个元素,具体的算法模板可以参考【算法基础课-算法模板1】基础算法中二分查找一节的内容。 然而,在这道题目中,数组…

使用 Serverless 架构快速构建基于 Iceberg 的事务型实时数据湖

文章目录1. 背景介绍2. 架构设计3. 方案实现3.1 CDC3.1.1 自定义插件3.1.2 配置 MSK Connect3.2 实时摄入3.2.1 Glue 实现方案3.2.1.1 在 Glue 中创建 Kafka connection3.2.1.2 Glue Streaming 任务3.2.2 EMS Serverless 实现方案3.3 使用 Athena 查询 Iceberg 表3.3.1 查询3.3…

Java零基础笔记20(Java高级技术:单元测试、反射、注解、动态代理)

1.单元测试2.反射2.1 反射第一步:加载类,获取类的字节码,class对象2.2 获取类中的成分(构造器、成员变量、成员方法),并对其进行操作获取构造器的作用:获取成员变量的作用:获取成员…

WinDbg 调试

安装 Windows 调试器 WinDbg 是一种调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查 CPU 寄存器和内存。 此最新版本具有更新的界面、完全现成的脚本功能、可扩展的调试数据模型、内置的时间旅行调试(TTD)支持和许多其他功能,具有更现代的用户体验。…

topographic terrain

在中文语境中,topographic(地形学)和 terrain(地形)这两个词都与地表特征相关,但它们的含义和使用场景有细微差别。以下是它们的区别: 1. 定义Topographic(地形学的)&…

SpringCloud 06 服务容错 Sentinel

雪崩:一个微小的故障引起系统其他部分出现故障,最终使整个系统不可用。 雪崩一般经历以下三个阶段: 实例能力出现过载。可能是 bug 导致性能下降,可能是实例宕机,可能是突发流量,总之实例无法处理如此多请求…

Qt同步处理业务并禁用按钮

1.界面代码 //按钮1 void Dialog::on_pushButton1_clicked() {qDebug("pushButton1 clicked start");enableBtns(false);//禁用按钮qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠,作为同步处理业务qDebug("pushButton1 do…

虚拟专用网技术

一、需求背景物理联通:实现不同物理位置网络的连接基础。网络联通:在物理连接基础上,实现数据等信息的传输互通。二、虚拟专用网简介定义虚拟私有网络是依靠互联网服务提供商(ISP)或其他网络服务提供商(NSP…

GANs生成对抗网络生成手写数字的Pytorch实现

目录 一、第三方库导入 二、数据集准备 三、使用转置卷积的生成器 四、使用卷积的判别器 五、生成器生成图像 六、主程序 七、运行结果 7.1 生成器和判别器的损失函数图像 7.2 训练过程中生成器生成的图像 八、完整的pytorch代码 由于之前写gans的代码时,…

ubuntu 通过NAT模式上网

这里必须使用VMnet8 设置为NAT模式 下面设置Ip地址区域ubuntu ip地址设置来自于上面

盲盒抽谷机小程序系统开发:从0到1的完整方法论

开发一款成功的盲盒抽谷机小程序系统,需兼顾技术实现、用户体验与商业逻辑。本文将从需求分析、UI/UX设计、技术架构、测试上线到运营增长,系统梳理从0到1的完整方法论。需求分析:明确“为谁而做”盲盒抽谷机的核心用户是18-35岁的二次元爱好…

web开发,在线%射击比赛管理%系统开发demo,基于html,css,jquery,python,django,三层mysql数据库

经验心得 两业务单,业务crud开发很简单了,自行学习,我说一下学习流程。什么是前端,用到那些技术html,css,javascript分别是什么?进阶jquery,bootstrap,各种常见前端组件又是什么,前端框架react,angular以及…

Centos9傻瓜式linux部署CRMEB 开源商城系统(PHP)

服务器环境推荐要求* Nignx(必须) * PHP 7.1 ~ 7.4(必须此版本内,版本过大会警告不兼容) * MySQL 5.7 ~ 8.0(必须) * Redis(非必须)后台页面展示:…

AI 云电竞游戏盒子:从“盒子”到“云-端-芯”一体化竞技平台的架构实践

摘要 AI 云电竞游戏盒子(以下简称“电竞盒”)不再是一台简单的客厅游戏主机,而是一套以 AI 调度为核心、以云原生架构为骨架、以边缘渲染为肌肉、以端侧感知为神经的“云-端-芯”协同竞技系统。本文基于 2024 年 Q2 落地的量产方案&#xff0…

基于kuboard实现kubernetes的集群管理

1、前提条件安装docker-compose2、步骤在本地目录创建kuboard-v4\在该目录下创建文件docker-compose.yaml,内容如下:configs:create_db_sql:content: |CREATE DATABASE kuboard DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;cre…

Linux操作系统软件编程——多线程

什么是线程线程的定义是轻量级的进程,可以实现多任务的并发。线程是操作系统任务调度的最小单位线程的创建由某个进程创建,且进程创建线程时,会为其分配独立的栈区空间(默认8M)。线程和所在的进程,以及进程…

linux下找到指定目录下最新日期log文件

以下是一个完整的C函数&#xff0c;用于在指定目录下自动查找最近更新的日志文件&#xff08;根据文件名中的时间戳选择最新的文件&#xff09;&#xff1a;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include…

《数学模型》经典案例——钢管的订购与运输

一、问题描述 要铺设一条 A1→A2→⋯→A15A_1 \rightarrow A_2 \rightarrow \cdots \rightarrow A_{15}A1​→A2​→⋯→A15​ 的输送天然气的主管道&#xff0c;如图 6.22 所示。经筛选后可以生产这种主管道钢管的钢厂有 S1,S2,⋯,S7S_1, S_2, \cdots, S_7S1​,S2​,⋯,S7​ 。…

Java Web部署

今天小编来分享下如何将本地写的Java Web程序部署到Linux上。 小编介绍两种方式&#xff1a; 部署基于Linux Systemd服务、基于Docker容器化部署 首先部署基于Linux Systemd服务 那么部署之前&#xff0c;要对下载所需的环境 软件下载 Linux&#xff08;以ubuntu&#xf…

告别AI“炼丹术”:“策略悬崖”理论如何为大模型对齐指明科学路径

摘要&#xff1a;当前&#xff0c;我们训练大模型的方式&#xff0c;尤其是RLHF&#xff0c;充满了不确定性&#xff0c;时常产生“谄媚”、“欺骗”等怪异行为&#xff0c;被戏称为“炼丹”。一篇来自上海AI Lab的重磅论文提出的“策略悬崖”理论&#xff0c;首次为这个混沌的…