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

Java中线程中断的几种方式,你了解吗?

Java中线程,可以使用 interrupt() 方法来实现线程的中断,那么,线程中中断的方式有几种呢?接下来,我们将介绍3种不同的线程中断方式,跟随我们的脚步,一起去看看!

目录

  • 第一招:volatile 变量法
  • 第二招:AtomicBoolean 原子类型
  • 第三招:interrupt() 方法


种一棵树最好的时间是10年前,其次就是现在,加油!
                                                                                   --by蜡笔小柯南

第一招:volatile 变量法

使用 volatile 关键字,来保证数据的可见性,在多个线程之间,数据是可见的,代码如下:

public class InterruptTest {static volatile boolean flag = false;public static void main(String[] args) throws Exception {interruptedMethod1();}private static void interruptedMethod1() throws InterruptedException {Thread t1 = new Thread(() -> {while (true) {if (flag) {System.out.println(Thread.currentThread().getName() + " isInterrupted " + Thread.currentThread().isInterrupted());break;}System.out.println(Thread.currentThread().getName() + "...");}});t1.start();TimeUnit.MILLISECONDS.sleep(1);Thread t2 = new Thread(() -> {flag = true;});t2.start();}
}

声明 volatile boolean flag = false ,由于在 interruptedMethod1 方法中,分别启动了线程t1,线程t2,为了保证 flag 的值在两个线程间可见,以及保证数据的一致性,所以声明为 volatile.

代码解析:

  1. 创建 t1 线程,while(true) 循环中,根据 flag 的值进行判断,从而得出 t1 线程是否跳出此循环;如果 flag 的值为 true ,则跳出循环,否则,一直打印线程t1的名称
  2. 创建 t2 线程,t2 线程中,将flag的值修改为true,由于flag为多线程可见,所以 t1 线程中判断到了flag的值是true,则执行打印输出语句后,执行break,结束循环

第二招:AtomicBoolean 原子类型

使用原子布尔类型,在多线程环境下对布尔值的读取和设置操作是线程安全的,避免了线程间的冲突和数据不一致的问题‌

public class InterruptTest {static AtomicBoolean atomicBoolean = new AtomicBoolean(false);public static void main(String[] args) throws Exception {interruptedMethod2();}private static void interruptedMethod2() throws InterruptedException {Thread t1 = new Thread(() -> {while (true) {if (atomicBoolean.get()) {System.out.println(Thread.currentThread().getName() + " isInterrupted " + Thread.currentThread().isInterrupted());break;}System.out.println(Thread.currentThread().getName() + "...");}});t1.start();TimeUnit.MILLISECONDS.sleep(1);Thread t2 = new Thread(() -> {atomicBoolean.set(true);});t2.start();}
}

代码分析:

  1. 通过调用 get() 方法,获取所设置的 boolean 值,如果值为true,则跳出循环,否则,一直打印线程t1的名称
  2. 线程t2使用 set(true) 方法,修改为true,修改后被t1线程感知到,进入if判断,结束循环

第三招:interrupt() 方法

调用线程的 interrupt() 方法,注意:此方法只是给线程设置一个标识,表示线程可中断,而不是调用此方法后,线程被立即中断,具体是否中断,还需要代码中进行判断处理

isInterrupted() :获取线程的中断状态,如果线程设置了中断标识位,返回true,否则,返回false

public class InterruptTest {public static void main(String[] args) throws Exception {interruptedMethod3();}private static void interruptedMethod3() throws InterruptedException {Thread t1 = new Thread(() -> {while (true) {if (Thread.currentThread().isInterrupted()) {System.out.println(Thread.currentThread().getName() + " isInterrupted " + Thread.currentThread().isInterrupted());break;}System.out.println(Thread.currentThread().getName() + "...");}});t1.start();TimeUnit.MILLISECONDS.sleep(1);Thread t2 = new Thread(() -> {t1.interrupt();});t2.start();}
}

代码分析:

  1. t1 线程中,调用的当前线程的 Thread.currentThread().isInterrupted() 方法,来判断当前线程是否可中断,如果为true,则进入if分支,执行break后结束循环
  2. t2 线程中,调用 t1.interrupt() ,给 t1 线程设置中断标志位为true,t1线程通过 Thread.currentThread().isInterrupted() 获取到的值为true,进入if分支,执行break后结束循环

注意:

Thread中的静态方法,Thread.interrupted ,与 isInterrupted() 方法有区别,静态方法的作用是:返回当前线程的中断标志位,如果当前线程的中断标志为处于true,则返回true,并清除中断标志位的状态,重置为false,这个方法有两个作用,一是将中断标志位返回,二是清除中断标志位的状态


那么,如果连续调用2次这个 Thread.interrupted 方法,会有什么效果呢?

:如果线程没有被调用 interrupt 方法,调用两次返回的都是false;如果线程被调用了 interrupt 方法,则第一次调用返回true,第二次调用返回false



如果你有任何疑问或经验分享,可以在评论区留言哦~~

不管在任何时候,我希望你永远不要害怕挑战,不要畏惧失败。每一个错误都是向成功迈出的一步,每一个挑战都是成长的机会,因为每一次的努力,都会使我们离梦想更近一点。只要你行动起来,任何时候都不算晚。最后,把座右铭送给大家:种一棵树最好的时间是10年前,其次就是现在,加油!共勉 💪。
快来吧 👇👇👇

不论是Java的基础资料,还是那些看似枯燥实则精妙的八股文,这里都有你意想不到的解读方式,让复杂变简单,让枯燥变有趣~

在这里插入图片描述

相关文章:

Java中线程中断的几种方式,你了解吗?

Java中线程,可以使用 interrupt() 方法来实现线程的中断,那么,线程中中断的方式有几种呢?接下来,我们将介绍3种不同的线程中断方式,跟随我们的脚步,一起去看看! 目录 第一招&#xf…...

Tesseract5.4.0自定义LSTM训练

准备jTessBoxEditor,然后配置环境变量。 1、将图片转换成tif格式的,这里需要用画图工具另存为; 2、生成box文件 执行命令: tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox 关于box文件…...

centOS7

特殊权限 set_uid 赋予所有者身份 chmod us 文件 set_gid 赋予所有组身份 chmod gs 文件/目录 sticky_bit 防火墙 firewall-cmd 开启端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent 重启防火墙 systemctl restart firewalld 查看开启的所有端口 fi…...

HTML5 弹跳动画(Bounce Animation)详解

HTML5 弹跳动画(Bounce Animation)详解 弹跳动画是一种动态效果,使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现,增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…...

4.1.3 串

文章目录 串的基本概念串的基本操作串的存储结构 串的基本概念 串,仅由字符构成的有限序列。 串长:串中的字符个数。空串:长度为0的串。空格串:一个或多个空格构成的串。子串:串中任意长度连续字符构成的序列。含有字…...

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …...

1月7日星期二今日早报简报微语报早读

1月7日星期二,农历腊月初八,早报#微语早读。 1、公安部:已为一线民警配备执法记录仪130万余部,规范现场执法; 2、浙江提出2035年全省域基本实现共同富裕; 3、“汕头牛肉丸”有新标准!1月6日起…...

随机置矩阵列为0[矩阵乘法pytorch版]

文章目录 1. 举例:2. python 代码 1. 举例: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] , r a n d [ 0 , 5 , 2 ] → A [ 0 1 0 3 4 0 6 7 0 9…...

C# 中mysql数据库,已经在原有数据库升级数据库脚本,去管理可以一次,和多次执行的,nuget包

在C#中,如果你需要管理数据库升级脚本,并且希望这些脚本能够支持一次执行和多次执行(即幂等性),你可以使用一些现成的NuGet包来简化这个过程。以下是一些常用的NuGet包: 1. DbUp 描述: DbUp 是一个轻量级…...

PCL 分段线性函数

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设我们有一个分段线性函数,并且我们希望在某个区间内对这个函数进行均匀采样,生成一系列的点。相对通用一些的思路就是对这个函数进行参数化,方法有很多,这在其他的博客中也有提到,不过PCL也为我们提供了一种…...

王静波页岩气:工厂蜕变的创业传奇

【小说】上世纪90年代,西部某工业园区的一家化工厂正面临着生存危机。厂里的锅炉设备老旧,煤炭价格飞涨,能源成本几乎压垮了生产线。王静波是这家工厂的技术主管,眼看工厂一天比一天萧条,他心里焦急万分,却…...

php反序列化 ctf例题演示 框架安全(TP,Yii,Laravel) phpggc生成框架利用pop

前言 php反序列化的框架的利用的pop是非常难写的 并且 我们不知道他的利用方法 所以PHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具…...

Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念上

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…...

入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网…...

vulnhub靶场【DC系列】之5

前言 靶机:DC-5,IP地址为192.168.10.4 攻击:kali,IP地址为192.168.10.2 都采用VMWare,网卡为桥接模式 对于文章中涉及到的靶场以及工具,我放置网盘中https://pan.quark.cn/s/2fcf53ade985 主机发现 使用…...

前端面试题合集

1.有哪些方式可以实现数据的实时更新? 一. AJAX轮询(Polling) 轮询是一种通过定时发送HTTP请求到服务器来检查数据更新的方法。客户端每隔一定时间(如每5秒)发送一个请求到服务器,服务器响应当前的数据状态…...

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统,通过车身四周安装的超广角像机,经算法合成全景鸟瞰图,通过鸟瞰图,司机非常清楚的看清楚车辆四周情况,大大降低盲区引发的交通事故。 产…...

基于 GEE Sentinel-1 数据集提取水体

目录 1 水体提取原理 2 完整代码 3 运行结果 1 水体提取原理 水体提取是地理信息和遥感技术的关键应用之一,对于多个领域都具有重要的应用价值。它有助于更好地管理水资源,保护环境,减少灾害风险,促进可持续发展,以…...

Python判断、循环练习

01 02 03...

【简博士统计学习方法】第1章:4. 模型的评估与选择

4. 模型的评估与选择 4.1 训练误差与测试误差 假如存在样本容量为 N N N的训练集,将训练集送入学习系统可以训练学习得到一个模型,我们将这么模型用决策函数的形式表达,也就是 y f ^ ( x ) y\hat{f}(x) yf^​(x),关于模型的拟合…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...