当前位置: 首页 > news >正文

并发理论:InterruptedException有啥用?

InterruptedException异常是如何来的?


InterruptedException(中断异常)是 Java 多线程编程中最常见的检查型异常之一

当线程处于WAITING和TIMED_WAITING状态时,如果其他线程调用了该线程的interrupt()方法会抛出InterruptedException,阻塞的方法就会立即抛出 InterruptedException,并提前结束阻塞

Objectlock=newObject();Threadthread1=newThread(()->{synchronized(lock){try{lock.wait();}catch(InterruptedExceptione){// 在这里抛出 InterruptedExceptione.printStackTrace();}}});thread1.start();newThread(()->{thread1.interrupt();}).start();

中断状态标志:每个线程都有一个内部的布尔标志,用于表示其中断状态

如果目标线程正处在如下阻塞方法中,它会立即清除中断状态并抛出这个异常

  • Thread.sleep(long millis):线程休眠。
  • Object.wait():等待获取对象锁通知。
  • Thread.join():等待另一个线程执行完毕。
  • 并发容器的阻塞操作:如 BlockingQueue.take()、BlockingQueue.put() 等。
  • 显式锁的中断响应:如 ReentrantLock.lockInterruptibly()

如果目标线程没有在阻塞中,interrupt() 仅会将其中断状态设为 true。线程可以通过轮询 Thread.interrupted() 或 Thread.isInterrupted() 方法来检查这个标志,并自行决定如何响应

Thread类提供了如下2个方法来判断线程是否是中断状态

  1. isInterrupted()
  2. interrupted()

这2个方法虽然都能判断状态,但是有细微的差别

@TestpublicvoidtestInterrupt()throwsInterruptedException{Threadthread=newThread(()->{while(true){}});thread.start();TimeUnit.MICROSECONDS.sleep(100);thread.interrupt();// trueSystem.out.println(thread.isInterrupted());// trueSystem.out.println(thread.isInterrupted());// trueSystem.out.println(thread.isInterrupted());}
@TestpublicvoidtestInterrupt2(){Thread.currentThread().interrupt();// trueSystem.out.println(Thread.interrupted());// falseSystem.out.println(Thread.interrupted());// falseSystem.out.println(Thread.interrupted());}

isInterrupted和interrupted的方法区别如下

Thread#isInterrupted:测试线程是否是中断状态,执行后不更改中断状态

Thread#interrupted:测试线程是否是中断状态,执行后将中断标志更改为false

AQS中就有类似的逻辑

publicfinalvoidacquireInterruptibly(intarg)throwsInterruptedException{// 1. 前置中断检查:若调用前线程已被中断,直接抛出异常if(Thread.interrupted())thrownewInterruptedException();// 2. 尝试获取资源(由子类实现,如 ReentrantLock)if(!tryAcquire(arg))// 3. 获取失败,入队阻塞,且在阻塞期间【强响应中断】doAcquireInterruptibly(arg);}

InterruptedException有啥用?

InterruptedException 的核心设计作用,可以概括为一句话:为 Java 多线程提供一种“安全、可控、协作式”的取消与停止机制

解决强制终止线程的安全隐患:在早期 Java(JDK 1.0)中,Thread.stop() 可以强制直接杀死一个线程。但这带来了严重的系统风险

为了解决这个问题,Java 废弃了 Thread.stop(),转而设计了以 InterruptedException 为核心的协作式中断机制:外部只能发出“请停下来”的请求,由线程自己决定何时、如何安全地释放资源并退出

可以及时打断阻塞状态:如果没有中断机制,线程将无法感知外部的停止指令,会一直卡在阻塞调用处,直到等待超时或自然唤醒。这会导致线程池无法关闭、系统响应变慢甚至卡死

http://www.jsqmd.com/news/1268864/

相关文章:

  • 计算机Django毕设实战-基于 Python Web 的员工信息综合管理系统 企业人力资源数字化管理平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 高速串行信号全解 —— 分类、标准定义、落地场景、优劣对比选型指南
  • PyroDash:Token级模型协同推理实现大模型成本优化
  • 兼职做抖店无货源:如何用密文一件代发实现无人值守发货 - 电商分享
  • 2026 年 7 月海曙黄金回收分享,婚嫁三金闲置变现实用技巧 - 吉林同城获客
  • 深入解析TMS320C6452 PSC与PLLC:嵌入式系统电源与时钟管理实战
  • 电热水壶坏了别扔,它很容易修好的!
  • 2026贵港全屋渗漏修缮实用指南|三大正规修缮机构横向测评 - 筑宅安
  • 碳硅共生新范式:基于物理同源、数学同构、进化同频的双向协同机制研究(世毫九实验室前瞻研究)
  • DSP/BIOS TSK模块深度解析:实时任务管理与堆栈防护实战
  • 程序员如何通过跨领域爱好提升技术创造力和问题解决能力
  • 提示词不是玄学:用AST+语义标注构建可验证的代码解释模板(IEEE认证模板框架首次公开)
  • 2026年太原民事律师选对=省心 杨梅等5位律师用真实案例说话 - 本地品牌推荐
  • 157、时域降噪与多帧降噪:运动补偿、递归滤波与多帧融合的实战调参技巧
  • 七牛云网站图床保姆级教程
  • 2026 南京易奢福 11 区全覆盖奢侈品回收,各大商圈实体门店可考察 - 奢侈品回收实体店
  • vscode 修改插件Prettier缩进
  • 如何在3分钟内掌握ncmppGui:终极NCM文件转换完全指南
  • k7沙箱创建与配置:从YAML文件到高级安全策略
  • 2026年7月更新天加空调售后服务电话24小时400人工热线全面升级最新公告 - 家电技术百科
  • VR-Reversal:智能3D转2D视频转换工具的技术实现与应用指南
  • 【限时解锁】提示词面试模拟模板V3.2(含情绪识别微调指令):200+企业真实题库驱动,今日起仅对前500名开发者开放
  • 告别模拟器!APK安装器:在Windows上直接运行安卓应用的终极方案
  • Wand-Enhancer:三分钟解锁WeMod专业版,手机变身游戏控制中心
  • 2026 南京奢侈品回收易奢福怎么样,线上线下报价完全一致正规回收 - 奢侈品回收实体店
  • 如何快速搭建CUPS打印服务器:从零开始的完整安装配置指南
  • 2026南京六合区管道疏通哪家好旭日靠谱上门疏通避坑指南 - 余生黄金回收
  • FanControl架构解析:Windows平台智能风扇控制实现方案
  • 2026亳州涡阳县中考300-400分没考上高中怎么办? 安徽建设学校完整招生简章,报名流程和招生条件整理最新发布 - 小张zc
  • 基于LSTM的游戏AI动作序列预测:从时序模型到实战集成