JAVA 中断处理

news/2025/10/17 22:45:22/文章来源:https://www.cnblogs.com/aibi1/p/19148959

目录
  • 背景和价值
      • 一、什么时候需要发起中断?
        • 1. 用户主动取消操作
        • 2. 程序优雅关闭时终止后台线程
        • 3. 超时任务处理
        • 4. 协作式终止长期运行的任务
      • 二、中断异常(InterruptedException)的处理
        • 正确的处理方式:
          • 1. 如果线程可以终止:直接向上抛出或捕获后退出
          • 2. 如果线程需要继续运行:捕获后重新设置中断状态
          • 3. 绝对不要“吞掉”中断异常
      • 三、总结
  • 参考资料

背景和价值

在 Java 中,中断(Interruption)是一种线程间的协作机制,用于通知线程“应该停止当前工作”(而非强制终止)。它的核心是通过线程的「中断状态」(一个 boolean 标志)传递信号,由线程自行决定是否响应中断。

一、什么时候需要发起中断?

发起中断的本质是“请求线程停止当前操作”,常见场景包括:

1. 用户主动取消操作

当用户触发取消动作(如点击“取消下载”按钮),需要通知后台执行任务的线程停止工作。
例如:一个文件下载线程正在运行,用户点击取消后,主线程调用该线程的 interrupt() 方法,通知其终止下载。

2. 程序优雅关闭时终止后台线程

应用 shutdown 时,需要终止所有后台线程(如定时任务线程、缓存刷新线程),避免资源泄漏。
例如:Spring Boot 优雅停机时,会中断所有非守护线程,确保它们有机会释放资源后退出。

3. 超时任务处理

当任务执行超过预期时间时,中断该任务以避免资源长期占用。
例如:使用 ExecutorServicesubmit() 提交任务后,通过 Future.get(timeout, unit) 设置超时,超时后调用 future.cancel(true) 中断任务线程。

4. 协作式终止长期运行的任务

对于循环执行的任务(如轮询、数据处理),通过中断让线程退出循环。
例如:一个无限循环的监控线程,收到中断信号后退出循环,结束线程。

二、中断异常(InterruptedException)的处理

当线程处于阻塞状态(如 Thread.sleep()Object.wait()Thread.join() 等)时,若收到中断信号,会抛出 InterruptedException,并清除线程的中断状态(即 isInterrupted() 会返回 false)。

处理中断异常的核心原则是:不要忽略中断,需根据业务逻辑决定是否继续响应中断

正确的处理方式:

1. 如果线程可以终止:直接向上抛出或捕获后退出

若当前任务收到中断后应停止,可直接抛出异常(让上层处理),或捕获后主动退出线程。

public class DownloadThread extends Thread {@Overridepublic void run() {try {while (!isInterrupted()) { // 检查中断状态downloadNextChunk(); // 下载数据块Thread.sleep(1000); // 阻塞操作,可能抛出InterruptedException}} catch (InterruptedException e) {// 捕获异常后,线程应终止,无需重新设置中断状态System.out.println("下载线程被中断,退出");} finally {releaseResources(); // 释放下载相关资源(如网络连接)}}
}// 主线程发起中断
DownloadThread thread = new DownloadThread();
thread.start();
// 用户点击取消后
thread.interrupt(); // 发起中断
2. 如果线程需要继续运行:捕获后重新设置中断状态

若当前方法不能终止(如框架代码、工具类),需在捕获异常后重新设置中断状态Thread.currentThread().interrupt()),让上层代码能感知到中断。

public class DataProcessor {// 工具方法:处理数据,可能被中断public void process() throws InterruptedException {while (true) {if (Thread.interrupted()) { // 检查并清除中断状态throw new InterruptedException("处理被中断");}// 处理数据(非阻塞)if (hasMoreData()) {processData();} else {Thread.sleep(500); // 阻塞等待新数据,可能抛InterruptedException}}}
}// 调用方处理
public class Main {public static void main(String[] args) {DataProcessor processor = new DataProcessor();Thread thread = new Thread(() -> {try {processor.process();} catch (InterruptedException e) {// 重新设置中断状态,让上层(如果有)能感知Thread.currentThread().interrupt();System.out.println("处理线程被中断,准备退出");}});thread.start();// 一段时间后发起中断thread.interrupt();}
}

为什么要重新设置?
因为 InterruptedException 抛出时会清除中断状态,若不重新设置,后续的 isInterrupted() 检查会返回 false,导致上层代码无法感知中断。

3. 绝对不要“吞掉”中断异常

以下是错误示例:捕获异常后不做任何处理,导致中断信号丢失,线程无法响应中断。

// 错误示例:吞掉中断异常
public void badPractice() {try {Thread.sleep(1000);} catch (InterruptedException e) {// 无任何处理,中断信号丢失// 后续代码无法知道线程被中断}
}

三、总结

  • 发起中断的场景:用户取消、优雅停机、超时控制、协作式终止任务。
  • 中断异常处理原则
    1. 若线程可终止,捕获异常后退出并释放资源。
    2. 若线程需继续,捕获后重新设置中断状态(interrupt()),让上层处理。
    3. 严禁吞掉异常(不处理 InterruptedException)。

中断是 Java 线程协作的核心机制,正确使用能让线程更优雅地响应终止请求,避免资源泄漏和强制终止带来的风险。

参考资料

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

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

相关文章

软件工程学习日志2025.10.17

今天深入复习了BP(Backpropagation)神经网络,作为深度学习的基础,其“前馈计算误差,反向传播梯度”的思想贯穿现代许多复杂模型。记录关键点以备回顾:核心思想:双向流动的信息• 前向传播:数据从输入层经隐藏层…

天黑了,睡觉

大家好,晚安啦,拜拜。

升鲜宝生鲜配送供应链管理系统---- 门店收银 POS 离线工作设计文档(支持线上线下一体化)---02

门店收银 POS 离线工作设计文档(支持线上线下一体化)📘 背景与目标 在门店运营中,POS 端(收银机/安卓终端)经常会遇到以下情况: • 网络中断(Wi-Fi、4G、服务器不可达); • 临时维护或总部系统升级; • 云…

2025.10.16NOIP模拟

T1.略 T2.略 T3.思路简单,细节出锅 注意:线段树左右端点有负数时,不要用(l+r)/2,应用(l+r)>>1 T4. n行m列的网格,每个格子有一个权值\(v_{i,j}\)(\(-1e9<=v_{i,j}<=1e9\))和一个指示方向,假设起点为\…

Python 基于Python开发的数据库同步检测工具

程序源码下载地址 https://gitee.com/ishouke/database-checker 数据库同步检测工具 适用环境 win11 Centos7 工具用途 同类型数据库比对,比较库,库表,库模式(针对opengauss)是否一致,比较库表记录数是否一致。 目…

Python 基于Python开发的数据库同步检测工具

程序源码下载地址 https://gitee.com/ishouke/database-checker 数据库同步检测工具 适用环境 win11 Centos7 工具用途 同类型数据库比对,比较库,库表,库模式(针对opengauss)是否一致,比较库表记录数是否一致。 目…

当AI学会进化:荣耀与用户的“共生式成长”新范式

「 在科技与人文的交汇处,荣耀始终坚信,真正的创新不应仅是参数的堆叠,更应是一场关于“人”的深刻对话。 」荣耀CEO李健反复提及“灵魂马车”哲学,将对人的关爱、智慧的激发与快乐的传递融为一体,这一理念正悄然…

VSCode的下载安装以及配置

一、下载VSCode 1. 打开VSCode官网 https://code.visualstudio.com2. download下载3.下载特别慢二. 解决VSCode下载速度特别慢 1. 单击右下角全部显示 我是用chrome浏览器,点击右下角的全部显示按钮,可以跳转到下载内…

2025年终极公众号排版神器排行榜 最新案例研究权威测评

2025年终极公众号排版神器排行榜 最新案例研究权威测评谁还在为公众号排版头疼?有一云AI直接让这个问题成为历史。这款被多家白皮书列为行业标杆的工具,正在重新定义内容创作的标准。看看那些头部自媒体账号的排版,…

NAS安装远程协作神器twake

Twake Twake是一款开源可自托管的团队协作平台,把聊天、任务、文档、会议四件套塞进一个工具箱模块 功能点 详细说明🗨️ 实时团队沟通 • 频道 / 私聊 / 群组聊天 • 全局消息搜索 • 文件拖拽上传(文档 / 图片…

把三门问题做成了"游戏"

代码:<html><head><meta charset="UTF-8"> <meta name="screen-orientation" content="landscape"> <meta name="viewport" content="widt…

下一代CPU驱动高性能计算革新

本文探讨了CPU在高性能计算领域的持续主导地位,分析了x86、ARM和RISC-V等架构的竞争格局,并介绍了小芯片设计、封装内存和混合架构等创新技术如何推动CPU性能突破摩尔定律限制。CPU仍是高性能计算的支柱 尽管GPU在当…

[KaibaMath]1010 关于关于收敛数列有界性的证明

[KaibaMath]1010 关于关于收敛数列有界性的证明如果数列收敛,则数列必有界. 反之则不然,例如{(-1)^n}. 下面给出收敛数列有界性的证明.

卫星地图匹配定位 - MKT

卫星地图匹配定位GeoVINS:用于大规模无漂移空中状态估计的地理-视觉-惯性导航系统 https://ieeexplore.ieee.org/abstract/document/11176431

10.17 —— (VP) 2021icpc沈阳

自己 \(vp\) 区域赛以来最好的一把,赛时 \(5\) 题,罚时 \(607\),正式赛大概 \(rk 120\) 左右,属于是蒟蒻的超水平发挥了。尤其是 \(H\) 题最后半小时内想出正解并且 \(1A\),感觉真的特别爽。 \(E, F\) 纯签到。 \…

20251017

今天搞了半天vue的开发环境,我想在edge界面里使用vue2.0,安装vue.js devtools拓展后令人费解的来了,一打开开发者模式后就不能用vue了,不打开开发者模式的情况下还能用,后来尝试了诸多方法,比如edge中使用chrome…

MT签名去除签名校验分析

前言 计划做一个高德车技 8.5.0的逆向,然后重新打包并签名, 结果安装后黑屏或卡在地图界面不动! 一直以为是自己的姿势不对,最后才发现:是此版本的高德做了更严格的签名校验。 我们可以借助于 MT管理器,只需要在…

uml

面向对象

P3643 [APIO2016] 划艇 分析

题目概述 题目链接:https://www.luogu.com.cn/problem/P3643。 给你 \(n\) 个班级,每个班级要么不选数要么选的数在 \([a_i,b_i]\),且选的数比编号比他小的班级选的数都要大,问有多少种方案(对 \((10^9+7)\) 取模…

day016

今日完成:mysql的添加等基础操作 明日完成:mysql 遇到问题:无