Java多线程3种中断方式和终止方式

一、线程中断

Java 中有以3 种方法可以中断正在运行的线程:

  1. 使用(volatile修饰)退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止;
  2. 也可使用 Atomic 变量作为退出标志,同样可以实现线程的中断;
  3. 使用 interrupt() 方法中断线程(只是中断线程执行,终止线程的睡眠(唤醒),并未终止线程)

1.volatile修饰的标记位

        定义一个boolean型的标志位,在线程的run方法中根据这个标志位是true还是false来判断是否退出

/*** 使用标志位终止线程* */
public class ThreadStop {public static void main(String[] args) {ThreadStopRunnable runnable = new ThreadStopRunnable();Thread t = new Thread(runnable);t.setName("t");t.start();try {Thread.sleep(1000 * 5);} catch (InterruptedException e) {e.printStackTrace();}//执行5秒之后终止线程,终止t线程的执行,将标记修改为false即可runnable.runFlag = false;System.out.println(Thread.currentThread().getName() + "\t" + "main is over");}
}class ThreadStopRunnable implements Runnable {//volatile修饰符用来保证其它线程读取的总是该变量的最新的值public volatile boolean runFlag = true;@Overridepublic void run() {for (int i = 1; i <= 100; i++) {if (runFlag){System.out.println(Thread.currentThread().getName() + "---->" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}else {//执行终止线程之前的代码,如保存数据等return;}}}
}

2.AtomicBoolean标记位

        可以使用AtomicBoolean作为标记位,省去volatile关键字修饰。

/*** 使用标志位终止线程* */
public class ThreadStop {public static void main(String[] args) {ThreadStopRunnable runnable = new ThreadStopRunnable();Thread t = new Thread(runnable);t.setName("t");t.start();try {Thread.sleep(1000 * 5);} catch (InterruptedException e) {e.printStackTrace();}//执行5秒之后终止线程,终止t线程的执行,将标记修改为false即可runnable.runFlag.set(false);System.out.println(Thread.currentThread().getName() + "\t" + "main is over");}
}class ThreadStopRunnable implements Runnable {//volatile修饰符用来保证其它线程读取的总是该变量的最新的值public AtomicBoolean runFlag = new AtomicBoolean(true);@Overridepublic void run() {for (int i = 1; i <= 100; i++) {if (runFlag.get()){System.out.println(Thread.currentThread().getName() + "---->" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}else {//执行终止线程之前的代码,如保存数据等return;}}}
}

3.interrupt() 中断

        使用interrupt()方法,仅仅是给线程打上中断标记位,并没有实际中断线程(把中断的权利交给线程本身,更安全)

        interrupt() 正在睡眠的线程会抛出InterruptedException异常。

/*** 使用标志位终止线程* */
public class ThreadStop {public static void main(String[] args) {ThreadStopRunnable runnable = new ThreadStopRunnable();Thread t = new Thread(runnable);t.setName("t");t.start();try {Thread.sleep(1000 * 5);} catch (InterruptedException e) {e.printStackTrace();}t.interrupt();System.out.println(Thread.currentThread().getName() + "\t" + "main is over");}
}class ThreadStopRunnable implements Runnable {@Overridepublic void run() {for (int i = 1; i <= 100; i++) {if (!Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName() + "---->" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();e.printStackTrace();}}else {//执行终止线程之前的代码,如保存数据等return;}}}
}

t---->1
t---->2
t---->3
t---->4
t---->5
main    main is over
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at org.mark.spring.test.ThreadStopRunnable.run(ThreadStop.java:35)
    at java.lang.Thread.run(Thread.java:748)

二、线程终止

        通过查看 JDK 的 API,我们会看到 java.lang.Thread 类型提供了一系列的方法如 start()、stop()、resume()、suspend()、destory()等方法来管理线程。但是除了 start() 之外,其它方法都被声名为已过时(deprecated)

        虽然 stop() 方法确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且该方法已被弃用,最好不要使用它。
JDK 文档中还引入用一篇文章来解释了弃用这些方法的原因:《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?》

为何弃用stop:

1、调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭

2、调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题

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

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

相关文章

水仙花数-C语言和python实现

C语言代码 #include<stdio.h>int main(){int i100,j0;int count0;int num0;for (; i < 1000; i){count i;for(;j<3;j){num num (count%10)*(count%10)*(count%10);count (int)(count/10);}if (numi){/* code */printf("%d是一个水仙花数\n",num);nu…

【解决问题】---- 解决 avue-crud 表格勾选数据翻页后界面保持选中

1. 错误预览 第一页选择【7、8、9、10】 直接点击第三页未进行选择 直接点击第四页未进行选择 2. 问题总结 通过测试可以看到&#xff0c;页面的选择项会影响到其他页面的选择&#xff1b;点击保存&#xff0c;返回的数据却是真真选择的数据&#xff1b;数据在选择渲染…

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息&#xff0c;同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…

@Autowired注入其他模块的bean失败

一、在Spring Boot中&#xff0c;如果要自动扫描和创建bean&#xff0c;需要在应用的启动类上使用ComponentScan注解来指定要扫描的包。确保你已经将GlobalConfig类所在的包和父包都添加到了ComponentScan注解的value属性中。 例如&#xff0c;如果GlobalConfig类所在的包为com…

CAN轴【禾川】

禾川CAN轴有问题。 厂家说是只能使用禾川的伺服X2EN&#xff0c;和X3EN 添加CAN主站&#xff1a; 网络&#xff1a; 0 波特率&#xff1a; 1000K 添加CAN总线&#xff1a; 主站&#xff1a; 2 同步帧&#xff1a; 80h 设置刷新时间 时间帧&#xff1a;100h 添加伺服&…

Vue el-table序号与复选框hover切换

效果图下&#xff1a; <template><div class"container"><el-tableref"multipleTable"id"multipleTable":data"person.tableData"cell-mouse-enter"cellEnter"cell-mouse-leave"cellLeave"selecti…

VSCode remote-ssh 连接远端服务器失败

系统 Mac os Intel处理器 描述 该问题在上午时还没有&#xff0c;下午突然毫无征兆的发生&#xff0c;当时没有更新vscode&#xff0c;没有更新插件。 分析 网上对于该问题的答案多是说磁盘空间不够vscode不能下载相应插件&#xff0c;我所遇到的并不是这种情况。报的错误多是…

Leetcode-LCR 021 删除链表的倒数第 N 个结点

快慢指针&#xff0c;快指针先移动n-1个节点后&#xff0c;慢指针从虚拟头结点出发&#xff08;相当于快慢指针相隔n个节点&#xff09;&#xff0c;快慢指针一起向链表尾依次移动一个结点&#xff0c;当快指针移动到表位时&#xff0c;慢指针正好移到被删除元素的前一个结点&a…

基于$indexStats 构建mongodb 所有集合的索引监控程序

使用mongodb时&#xff0c;为集合中经常查询的字段添加索引&#xff0c;能够提高查询效率&#xff0c;减少扫描数据次数&#xff0c;限制扫描数据量&#xff0c;减少排序时间和内存与CPU的消耗。但索引的更新会为数据的添加和更新带来额外的消耗。因此&#xff0c;需要定期检查…

Python数据容器(字符串)

字符串 1.字符串 字符串也是数据容器的一种&#xff0c;字符串是字符的容器&#xff0c;一个字符串可以存放任意数量的字符。 2.字符串的下标索引 从前向后&#xff0c;下标从0开始从后向前&#xff0c;下标从-1开始 # 通过下标索引获取特定位置的字符 name python print(na…

关于使用template时的错误注意

今天在写c程序的时候&#xff0c;在使用template时遇到了一个关于template的错误用法。代码如下#include <vector> #include <algorithm> #include <forward_list> #include <string> #include <list> using namespace std; template <typena…

TinyEngine 开源低代码引擎首次直播答疑QA合集

前言 10月27日晚8点&#xff0c;OpenTiny 社区开启了 TinyEngine 开源低代码引擎首次答疑直播&#xff0c;本次直播我们通过收集开发者诉求&#xff0c;精心策划和组织了内容&#xff0c;希望提供给大家最明确和清晰的答疑方式。这是 TinyEngine 低代码引擎直播计划的开端&…

React处理用户交互事件,如点击、输入框变化等,并使用事件处理函数来响应这些事件

在 React 中处理用户交互事件&#xff0c;如点击、输入框变化等&#xff0c;需要使用事件处理函数来响应这些事件。以下是一些学习和使用事件处理函数的基本步骤&#xff1a; 绑定事件处理函数&#xff1a; 首先&#xff0c;在你的组件中为要处理的元素&#xff08;如按钮、输…

探索OpenCV中直方图的神奇之处:应用与实现

文章目录 导言&#xff1a;直方图概述&#xff1a;函数原型参数说明&#xff1a;代码示例 应用场景&#xff1a;结语&#xff1a; 导言&#xff1a; 直方图是数字图像处理中一个强大而重要的工具&#xff0c;它通过可视化数据的分布情况&#xff0c;帮助我们更好地理解图像的特…

Flutter 第三方 flutter_screenutil(屏幕适配)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

【Royalty in Wind 2.0.0】个人体测计算、资料分享小程序

前言 Royalty in Wind 是我个人制作的一个工具类小程序。主要涵盖体测计算器、个人学习资料分享等功能。这个小程序在2022年第一次发布&#xff0c;不过后来因为一些原因暂时搁置。现在准备作为我个人的小程序重新投入使用XD PS&#xff1a;小程序开发部分我是在21年跟随郄培…

vue3异步组件

父组件中&#xff0c;子组件的加载一般是按照先后顺序加载的&#xff0c;子组件加载后才会加载父组件。 一个页面的子组件很多&#xff0c;由于会先加载子组件&#xff0c;那么父组件可能会出现比较长的白屏等待时间 大型项目&#xff0c;可能需要拆分应用为更小的块&#xf…

FL Studio21.2宿主软件中文免费版下载

纵观当下宿主软件市场&#xff0c;正值百家争鸣、百花齐放之际像Mac系统的Logic Pro X、传统宿主软件代表Cubase、录音师必备Pro Tools、后起之秀Studio One等&#xff0c;都在各自的领域具有极高的好评度。而在众多宿主软件中&#xff0c;有这么一款历久弥新且长盛不衰的独特宿…

JAVA判断指定日期是否在指定的时间段内

参考文献: Java语言判断当前时间在时间范围内_java判断时间区间-CSDN博客 package com.itheima.method2;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;public class DateTest {public static voi…

sqli-bypass wp

sqli-bypass靶场 level 1 尝试注入点 1 ,1&#xff0c;1,1",1"" 》存在字符型单引号注入 id1and(1)-- >提示存在sql注入 bypass and、()、--都可能存在被屏蔽掉 尝试#代替-- id1and(1)%23 》 正常回显&#xff0c;说明–被屏蔽了&#xff0c;and&#xf…