中断(Interrupt):java中的每个线程自身都维护这一个boolean型的中断标识(JVM帮我们搞定了),唯有通过Thread.interrupt()方法可以将其置为true,(我们可以通过interrupted()/isInterrupted()方法来判断线程是否处于中断状态,需要注意的是:interrupted()方法会重置线程的中断状态,即将标识置为false),线程遇到中断,并不会立即停止,而且线程会是死亡、等待新的任务亦或是无视中断继续运行,这都还取决于程序本身的处理。
其实,java也试图提供过抢占式中断,像已经被deprecated的Thread.stop()、Thread.suspend()、Thread.resume等,都问题多多。现在java的线程调度采用协作式中断,原理很简单:轮询某个表示中断的标记。
/** * @author Sonicery_D * @date 2014年12月23日 * @version 1.0.0 * @description **/ public class TestInterrupt implements Runnable{ volatile boolean isInterrupted = false; @Override public void run() { while(true){ if(isInterrupted){ System.out.println("isInterrupted ............"); break; } System.out.println("test---Interrupt---"+System.currentTimeMillis()); } } public static void main(String[] args){ TestInterrupt testInterrupt = new TestInterrupt(); Thread t = new Thread(testInterrupt); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("发起中断..."); testInterrupt.isInterrupted = true; } }
但是当我们遇到阻塞方法时,上述的代码就束手无策了。如Object.wait()/Thread.sleep()/Thread.join()等阻塞方法
注意通常我们调用Thread.interrupt()方法时无法立即引发中断的,它还是设置了JVM内部维护的中断标志,通过这个思路,应用程序可以检查中断标志来做一些特殊操作或者忽略掉中断。
/** * @author Sonicery_D * @date 2014年12月23日 * @version 1.0.0 * @description **/ public class TestInterrupt implements Runnable{ volatile boolean isInterrupted = false; @Override public void run() { while(true){ if(Thread.currentThread().isInterrupted()){ System.out.println("isInterrupted ............"); break; } System.out.println("test---Interrupt---"+System.currentTimeMillis()); } } public static void main(String[] args){ TestInterrupt testInterrupt = new TestInterrupt(); Thread t = new Thread(testInterrupt); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("发起中断..."); t.interrupt();//调用Thread.interrupt()是无法立即引发中断 只是将JVM内部维护的中断标志置为true // testInterrupt.isInterrupted = true; } }
在执行线程调度的阻塞调用时(Object.wait()/Thread.sleep()/Thread.join())如果发生中断,被阻塞线程会“尽可能快的”抛出InterruptedException。因此我们可以对阻塞时的中断作出处理。
public class TestInterrupt implements Runnable{ volatile boolean isInterrupted = false; @Override public void run() { while(!isInterrupted){ try { Thread.sleep(5000); System.out.println("test---Interrupt---"+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); System.out.println("occur the interrupted ... ..."); } } } public static void main(String[] args){ TestInterrupt testInterrupt = new TestInterrupt(); Thread t = new Thread(testInterrupt); t.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("发起中断..."); testInterrupt.isInterrupted = true; t.interrupt(); } }
我们也可以不使用volatile修饰的可见变量,使用Thread.interrupted()/Thread.isInterrupted()来判断是否需要中断
/** * @author Sonicery_D * @date 2014年12月23日 * @version 1.0.0 * @description **/ public class TestInterrupt implements Runnable{ @Override public void run() { while(true){//Thread.interrupted() 会将中断状态重置为false try { test(); } catch (InterruptedException e) {//注意这里因为上层再没有需要判断中断的方法,所以我并没有继续向上层方法调用栈抛异常 e.printStackTrace(); System.out.println("occur the interrupted ... ..."); break; } } } public void test() throws InterruptedException{ if(Thread.interrupted()){ throw new InterruptedException("test 操作发生了中断 ... ..."); } } public static void main(String[] args){ TestInterrupt testInterrupt = new TestInterrupt(); Thread t = new Thread(testInterrupt); t.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("发起中断..."); if(t.isAlive()) t.interrupt(); } }
在任务和线程分离的框架中,任务通常不能提前知道会被那个线程执行,也就不知道具体调用线程处理中断的策略,故 在任务被设置了中断标志后并不能保证任务会被取消。
一般来说除非你知道线程的中断策略,否则我们不应该中断它。例如,我们不应直接调用Executor之类的框架线程的interrupt方法,应该调用类似Future.cancel方法来取消任务。
另外,任务代码不应该猜测中断对执行线程的含义。一般代码遇到InterruptedException时,不应捕捉后将其“吃掉” 应该继续向上层 抛出。
相关推荐
ROS基于C++动力学约束的路径规划源码+ppt文件.zip
ASP.NET B/S结构城市酒店入住信息管理系统的设计与实现简介 一、项目背景与意义 随着城市旅游的蓬勃发展,酒店业作为旅游产业链中的重要一环,面临着日益激烈的市场竞争。为了提升酒店的服务质量和管理效率,信息化管理成为酒店业不可或缺的一部分。因此,我们设计并实现了一个基于ASP.NET的B/S(浏览器/服务器)结构城市酒店入住信息管理系统。该系统旨在帮助酒店实现入住信息的快速录入、查询、修改和统计,提升酒店的运营效率和客户体验。 二、系统主要功能 用户管理:系统支持管理员、前台服务员、客户等不同角色的注册、登录和权限管理。通过角色权限的设置,确保系统数据的安全性和完整性。 房间管理:管理员可以添加、编辑、删除房间信息,包括房间类型、价格、状态等。前台服务员可以实时查看房间状态,为客人办理入住和退房手续。 入住信息管理:前台服务员可以录入客人的入住信息,包括姓名、证件号码、联系方式、入住时间和离店时间等。系统支持客人信息的快速查询和修改,方便前台服务员处理各种客户需求。 费用管理:系统根据客人的入住时间和房间价格自动计算费用,并支持多种支付方式。管理员可以设置折扣、优惠券等促销
基于streamlit的YOLOv8可视化交互界面
liba52-0-0.7.5+svn613-lp152.3.2.aarch64
基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
121342141414
哈希算法的特点
复刻平衡小车,自行添加了转向环和蓝牙控制,蓝牙APP使用的是轮趣科技的。该项目为复刻平衡小车,其中大量代码为b站up主_WNNN的开源代码,加了转向环的代码,添加蓝牙控制功能. 该小车主体由洞洞板焊接,使用的io口焊的时候忘记记了,随缘吧。
zend解密 dezender12 dezender12是一个专业对用Zend Encoder/SafeGuard, ionCube, SourceGuardian,phpcipher、codelock或SourceCop加密过的PHP文件进行破解的网站, 它主要运用密码分析、解压缩和反编译技术将经编码/加密过的PHP文件还原为可阅读、可执行的PHP源文件。
客户端环境配置 第一步 配置python环境 下载python(版本:python>=3.8)(建议使用访问Anaconda官网配置虚拟环境,具体步骤如下) 1)访问Anaconda官网:https://www.anaconda.com/products/individual 2)选择相应的操作系统版本并下载对应的安装包(推荐下载64位版本) 3)打开下载的安装包,按照提示进行安装即可 4)创建一个虚拟环境: conda create --name 自命名 python=3.9.16 第二步 下载库 注意:下载库前,如果想要更好的帧数体验请安装cuda版本哦(因为一般默认会安装cpu的版本) pip换源: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到项目文件夹下,下载依赖: pip install -r requirements.txt 我自己使用的环境:python3.9+CPU 第三步 运行项目(如果不需要(开启网页端) 或 (对接RTSP))
运用Qt框架+FFmpeg音视频解码库实现音频播放器,通过实时解码音频传给设备进行播放,可供学习和参考
liba2ps1-4.15.5-2.2.s390x
一个基于linux C++的Flv解析器.zip
机械设计电机冲切转子组装一体机sw18可编辑非常好的设计图纸100%好用.zip
本Bash脚本用于自动化管理Java JAR应用的启动、停止及监控。首先检查JAR进程是否在运行,如在运行则安全终止。随后,使用预设的Java参数启动JAR文件,并将输出和错误日志重定向至日志文件。启动后,脚本持续监控JAR进程状态,确保其在预设时间内成功启动。本脚本提供了灵活的配置和错误处理机制,为Java应用的运维管理带来了便捷与可靠性。
2024-2030全球及中国太阳能汽油泵行业研究及十五五规划分析报告
Geek
yolov3无人机俯视视角下热红外行人小目标检测权重, 包含5000多千张YOLO算法无人机俯视视角下热红外行人小目标数据集,数据集目录已经配置好,yolo格式的标签,划分好 train,val, test,并附有data.yaml文件,yolov5、yolov7、yolov8等算法可以直接进行训练模型, 数据集和检测结果参考:https://blog.csdn.net/zhiqingAI/article/details/124230743 数据集配置目录结构data.yaml: nc: 1 names: ['person']
基于C#的开源音乐播放器MetroPlayer.zip
WMS项目系统解决方案-智能仓储基础架构qy.ppt