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

Java——线程的中断

线程的中断1、取消/关闭的场景2、取消/关闭的机制3、线程对中断的反应3.1、Runnable3.2、Waiting/Timed_Waiting3.3、Blocked3.4、New/Terminate4、如何正确地取消/关闭线程1、取消/关闭的场景我们知道通过线程的start方法启动一个线程后线程开始执行run方法run方法运行结束后线程退出那为什么还需要结束一个线程呢有多种情况比如很多线程的运行模式是死循环比如在生产者/消费者模式中消费者主体就是一个死循环它不停地从队列中接受任务执行任务在停止程序时我们需要一种“优雅”的方法以关闭该线程。在一些图形用户界面程序中线程是用户启动的完成一些任务比如从远程服务器上下载一个文件在下载过程中用户可能会希望取消该任务。在一些场景中比如从第三方服务器查询一个结果我们希望在限定的时间内得到结果如果得不到我们会希望取消该任务。有时我们会启动多个线程做同一件事比如类似抢火车票我们可能会让多个好友帮忙从多个渠道买火车票只要有一个渠道买到了我们会通知取消其他渠道。2、取消/关闭的机制Java的Thread类定义了如下方法publicfinalvoidstop()这个方法看上去就可以停止线程但这个方法被标记为了过时简单地说我们不应该使用它可以忽略它。在Java中停止一个线程的主要机制是中断中断并不是强迫终止一个线程它是一种协作机制是给线程传递一个取消信号但是由线程来决定如何以及何时退出。Thread类定义了如下关于中断的方法publicbooleanisInterrupted()publicvoidinterrupt()publicstaticbooleaninterrupted()这三个方法名字类似比较容易混淆我们解释一下。isInterrupted()和interrupt()是实例方法调用它们需要通过线程对象interrupted()是静态方法实际会调用Thread. currentThread()操作当前线程。每个线程都有一个标志位表示该线程是否被中断了。isInterrupted返回对应线程的中断标志位是否为true。interrupted返回当前线程的中断标志位是否为true但它还有一个重要的副作用就是清空中断标志位也就是说连续两次调用interrupted()第一次返回的结果为true第二次一般就是false除非同时又发生了一次中断​。interrupt表示中断对应的线程。中断具体意味着什么呢下面我们进一步来说明。3、线程对中断的反应interrupt()对线程的影响与线程的状态和在进行的IO操作有关。我们主要考虑线程的状态IO操作的影响和具体IO以及操作系统有关我们就不讨论了。线程状态有RUNNABLE线程在运行或具备运行条件只是在等待操作系统调度。WAITING/TIMED_WAITING线程在等待某个条件或超时。BLOCKED线程在等待锁试图进入同步块。NEW/TERMINATED线程还未启动或已结束。3.1、Runnable如果线程在运行中且没有执行IO操作interrupt()只是会设置线程的中断标志位没有任何其他作用。线程应该在运行过程中合适的位置检查中断标志位比如如果主体代码是一个循环可以在循环开始处进行检查如下所示publicclassInterruptRunnableDemoextendsThread{Overridepublicvoidrun(){while(!Thread.currentThread().isInterrupted()){//…单次循环代码}System.out.println(done );}//其他代码}3.2、Waiting/Timed_Waiting线程调用join/wait/sleep方法会进入WAITING或TIMED_WAITING状态在这些状态时对线程对象调用interrupt()会使得该线程抛出InterruptedException。需要注意的是抛出异常后中断标志位会被清空而不是被设置。比如执行如下代码ThreadtnewThread(){Overridepublicvoidrun(){try{Thread.sleep(1000);}catch(InterruptedExceptione){System.out.println(isInterrupted());}}};t.start();try{Thread.sleep(100);}catch(InterruptedExceptione){}t.interrupt();程序的输出为false。InterruptedException是一个受检异常线程必须进行处理。我们在异常处理中介绍过处理异常的基本思路是如果知道怎么处理就进行处理如果不知道就应该向上传递通常情况下不应该捕获异常然后忽略。捕获到InterruptedException通常表示希望结束该线程线程大致有两种处理方式向上传递该异常这使得该方法也变成了一个可中断的方法需要调用者进行处理有些情况不能向上传递异常比如Thread的run方法它的声明是固定的不能抛出任何受检异常这时应该捕获异常进行合适的清理操作清理后一般应该调用Thread的interrupt方法设置中断标志位使得其他代码有办法知道它发生了中断。第一种方式的示例代码如下publicvoidinterruptibleMethod()throwsInterruptedException{//…包含wait, join 或 sleep 方法Thread.sleep(1000);}第二种方式的示例代码如下publicclassInterruptWaitingDemoextendsThread{Overridepublicvoidrun(){while(!Thread.currentThread().isInterrupted()){try{//模拟任务代码Thread.sleep(2000);}catch(InterruptedExceptione){//...清理操作//重设中断标志位Thread.currentThread().interrupt();}}System.out.println(isInterrupted());}publicstaticvoidmain(String[]args){InterruptWaitingDemodemonewInterruptWaitingDemo();demo.start();demo.interrupt();}}3.3、Blocked如果线程在等待锁对线程对象调用interrupt()只是会设置线程的中断标志位线程依然会处于BLOCKED状态也就是说interrupt()并不能使一个在等待锁的线程真正“中断”​。我们看段代码publicclassInterruptSynchronizedDemo{privatestaticObjectlocknewObject();privatestaticclassAextendsThread{Overridepublicvoidrun(){synchronized(lock){while(!Thread.currentThread().isInterrupted()){}}System.out.println(exit);}}publicstaticvoidtest()throwsInterruptedException{synchronized(lock){AanewA();a.start();Thread.sleep(1000);a.interrupt();a.join();}}publicstaticvoidmain(String[]args)throwsInterruptedException{test();}}test方法在持有锁lock的情况下启动线程a而线程a也去尝试获得锁lock所以会进入锁等待队列随后test调用线程a的interrupt方法并调用join等待线程线程a结束线程a会结束吗不会interrupt方法只会设置线程的中断标志而并不会使它从锁等待队列中出来。在使用synchronized关键字获取锁的过程中不响应中断请求这是synchronized的局限性。如果这对程序是一个问题应该使用显式锁。3.4、New/Terminate如果线程尚未启动NEW​或者已经结束TERMINATED​则调用interrupt()对它没有任何效果中断标志位也不会被设置。4、如何正确地取消/关闭线程interrupt方法不一定会真正“中断”线程它只是一种协作机制如果不明白线程在做什么不应该贸然地调用线程的interrupt方法以为这样就能取消线程。对于以线程提供服务的程序模块而言它应该封装取消/关闭操作提供单独的取消/关闭方法给调用者外部调用者应该调用这些方法而不是直接调用interrupt。Java并发库的一些代码就提供了单独的取消/关闭方法比如Future接口提供了如下方法以取消任务booleancancel(booleanmayInterruptIfRunning);再如ExecutorService提供了如下两个关闭方法voidshutdown();ListRunnableshutdownNow();

相关文章:

Java——线程的中断

线程的中断1、取消/关闭的场景2、取消/关闭的机制3、线程对中断的反应3.1、Runnable3.2、Waiting/Timed_Waiting3.3、Blocked3.4、New/Terminate4、如何正确地取消/关闭线程1、取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行…...

Cursor Free VIP:如何轻松突破AI编程助手限制的完整指南

Cursor Free VIP:如何轻松突破AI编程助手限制的完整指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...

Input Leap:一款让多设备共享键盘鼠标变得简单高效的开源KVM软件

Input Leap:一款让多设备共享键盘鼠标变得简单高效的开源KVM软件 【免费下载链接】input-leap Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/in/input-leap 你是否厌倦了在多个电脑之间来回切换键盘和鼠标?是否希望用一套…...

RK3576开发板AIoT实战:从模型转换到边缘部署全流程解析

1. 项目概述:从一块开发板到AI应用落地的完整旅程 最近几年,AIoT(人工智能物联网)的概念越来越火,但很多开发者朋友拿到一块功能强大的开发板后,往往卡在“如何把AI模型真正跑起来”这一步。我手头这块RK35…...

Steam创意工坊模组下载终极指南:轻松获取1000+游戏模组的完整解决方案

Steam创意工坊模组下载终极指南:轻松获取1000游戏模组的完整解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊模组而烦恼吗&…...

一键永久放开权限(神州网信政府版专用)普通用户 安装软件的权限

一键永久放开权限(神州网信政府版专用) 第一步:先登录Administrator超级管理员 WinR 输入 netplwiz 回车勾选要使用本机,用户必须输入用户名和密码选中 Administrator 设为默认,注销重登进这个账号 第二步:…...

OpenHarmony模块配置实战:从GN模板到部件依赖的完整指南

1. 从零开始理解OpenHarmony的模块配置:一个资深开发者的实战拆解如果你刚开始接触OpenHarmony的源码开发,面对那一堆BUILD.gn文件和bundle.json配置,是不是感觉有点无从下手?模块、部件、子系统,这些概念听起来就让人…...

NotebookLM智能体插件开发:连接AI笔记与外部工具的实现指南

1. 项目概述:当AI笔记助手学会“动手”最近在折腾AI应用开发的朋友,可能都注意到了GitHub上一个挺有意思的项目:amp-rh/notebooklm-agent-plugin。乍一看名字,它像是Google那个实验性AI笔记工具NotebookLM的一个插件。但如果你深入…...

KV缓存优化与RAG系统性能提升实践

1. KV缓存技术原理与RAG系统挑战 在大型语言模型(LLM)推理过程中,KV(Key-Value)缓存技术通过存储注意力机制计算产生的中间状态来避免重复计算。具体来说,Transformer架构中的每个解码器层都会为输入序列生成键(Key)和值(Value)矩…...

UVM配置机制深度解析:从字符串匹配原理到验证平台实战

1. 项目概述:从“会用”到“懂它”的跨越在芯片验证的日常工作中,uvm_config_db就像空气和水一样,无处不在。我们用它传递虚拟接口,用它开关某个子系统的功能,用它动态调整测试场景的配置。绝大多数验证工程师都能熟练…...

本地大模型一站式图形化工具Hermes-Studio部署与调优指南

1. 项目概述与核心价值最近在折腾本地大模型应用开发时,发现了一个挺有意思的项目,叫 Hermes-Studio。乍一看这个名字,你可能以为是某个新的IDE或者设计工具,但实际上,它是一个专门为本地运行的大型语言模型&#xff0…...

Midscene.js技术架构深度解析:构建企业级视觉驱动自动化测试平台的技术挑战与解决方案

Midscene.js技术架构深度解析:构建企业级视觉驱动自动化测试平台的技术挑战与解决方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今多平台、…...

别再乱删注册表了!Windows 10/11 下 MySQL 8.0.32 保姆级卸载与重装避坑指南

MySQL 8.0 深度清理与重装实战手册:从根源解决安装冲突问题 当你在Windows系统上反复安装MySQL时,是否遇到过这些令人抓狂的提示?"Service already exists"、"Port 3306 already in use"或是安装程序莫名其妙回滚。这些问…...

终极指南:如何用MAA Assistant Arknights实现明日方舟全自动化

终极指南:如何用MAA Assistant Arknights实现明日方舟全自动化 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: htt…...

2025届毕业生推荐的六大AI辅助论文方案实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当人工智能技术广泛渗透开来,它于各行各业的应用在持续深入发展。在自动化客服方…...

SLCAN协议实战:从脚本编写到自动化测试全解析

1. SLCAN协议基础:嵌入式开发者的文本化CAN接口 第一次接触SLCAN协议时,我正为一个汽车电子项目头疼——需要快速验证CAN总线设备却找不到合适的调试工具。直到发现抽屉里吃灰的LAWICEL CANUSB适配器,这个基于SLCAN协议的小玩意彻底改变了我…...

ChanlunX:通达信缠论分析的终极自动化解决方案

ChanlunX:通达信缠论分析的终极自动化解决方案 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX ChanlunX是一款专为通达信用户设计的开源缠论分析插件,通过智能算法将复杂的缠论理论…...

大语言模型记忆增强框架:LightMem原理、实现与工程实践

1. 项目概述:当大模型遇上“记忆”瓶颈最近在折腾大语言模型(LLM)应用开发的朋友,估计都遇到过同一个头疼的问题:模型记不住事儿。你精心设计了一个对话系统,希望它能记住用户的历史偏好,比如“…...

G-Helper终极指南:3步快速解决华硕笔记本色彩失真问题

G-Helper终极指南:3步快速解决华硕笔记本色彩失真问题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Ex…...

SLO-Warden:基于错误预算的智能SLO守护平台设计与实践

1. 项目概述:一个面向SLO的智能守护者在云原生和微服务架构成为主流的今天,服务的稳定性和可靠性不再是“锦上添花”,而是“生死攸关”的底线。作为一线的运维工程师或SRE,我们每天都在和各种监控指标、告警风暴作斗争。传统的监控…...

Ubuntu Apache WebDAV 服务部署与多用户自动化管理

1. WebDAV服务基础认知与场景价值 第一次听说WebDAV这个词时,我也是一头雾水——这串字母组合看起来像某种神秘协议。直到有次团队需要共享设计素材库,才发现这个1996年就诞生的老协议,在云存储时代依然散发着独特魅力。简单来说,…...

合宙BluePill开发板:9.9元ARM Cortex-M核心板硬件解析与实战指南

1. 项目概述:一块“炸场”的开发板意味着什么最近在嵌入式开发圈子里,一块名为“合宙BluePill”的新品开发板以9.9元包邮的价格开售,瞬间点燃了众多开发者、电子爱好者和学生群体的热情。这个价格,别说是一块功能完整的开发板&…...

告别风扇噪音烦恼!Fan Control:Windows上最智能的免费风扇控制软件完全指南

告别风扇噪音烦恼!Fan Control:Windows上最智能的免费风扇控制软件完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https:/…...

FPGA新手避坑指南:用Vivado IP核搞定AXI总线,从看懂波形开始

FPGA新手避坑指南:用Vivado IP核搞定AXI总线,从看懂波形开始 第一次在Vivado中看到AXI总线波形时,我盯着屏幕上跳动的信号线完全摸不着头脑。VALID和READY信号像在玩捉迷藏,突发传输的时序如同天书——这大概是每个FPGA初学者都会…...

罗技鼠标压枪宏配置实战:游戏辅助脚本的完整应用方案

罗技鼠标压枪宏配置实战:游戏辅助脚本的完整应用方案 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中枪口乱飘而苦恼…...

DayZ社区离线模式:5步搭建专属单人末日世界

DayZ社区离线模式:5步搭建专属单人末日世界 【免费下载链接】DayZCommunityOfflineMode A community made offline mod for DayZ Standalone 项目地址: https://gitcode.com/gh_mirrors/da/DayZCommunityOfflineMode DayZ社区离线模式为玩家提供了一个完整的…...

GitHub代码仓库导航:开发者如何高效构建与使用技术资源地图

1. 项目概述:一个面向开发者的代码仓库导航 最近在GitHub上闲逛,发现了一个挺有意思的仓库,叫 yeabnoah/vx_code 。乍一看这个标题,可能会有点摸不着头脑, vx_code 是什么?是某种新的编程语言&#xf…...

LTC3305铅酸电池平衡器与PTC限流方案设计

1. LTC3305铅酸电池平衡器工作原理 LTC3305是Linear Technology(现属ADI)推出的一款专用于铅酸电池组的主动平衡控制器。其核心功能是通过一个辅助电池(AUX)在串联电池组间进行电荷转移,实现电压均衡。这种架构特别适合…...

终极Citra 3DS模拟器完整指南:在电脑上免费畅玩任天堂3DS游戏

终极Citra 3DS模拟器完整指南:在电脑上免费畅玩任天堂3DS游戏 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想要在电脑上重温《精灵宝可梦》系列、《塞尔达传说》等经典3DS游戏吗?Ci…...

从网站点击到疾病预测:泊松回归模型在5个真实业务场景下的应用拆解与避坑指南

从网站点击到疾病预测:泊松回归模型在5个真实业务场景下的应用拆解与避坑指南 在数据驱动的商业决策中,计数型数据的分析往往被忽视。想象一下:电商平台每天需要决定发送多少条推送通知,客服中心要预测每小时可能接到的投诉电话数…...