hread.interrupt()到底意味着什么
首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。
所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。
而 Thread.interrupt 的作用其实也不是中断线程,而是「通知线程应该中断了」,
具体到底中断还是继续运行,应该由被通知的线程自己处理。
具体来说,当对一个线程,调用 interrupt() 时,
① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。
② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。
interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
也就是说,一个线程如果有被中断的需求,那么就可以这样做。
① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。
② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)
interrupt()方法:对目标线程发送中断请求,看其源码会发现最终是调用了一个本地方法实现的线程中断;
interrupted()方法:返回目标线程是否中断的布尔值(通过本地方法实现),且返回后会重置中断状态为未中断=false;
isInterrupted()方法:该方法返回的是线程中断与否的布尔值(通过本地方法实现),不会重置中断状态;
示例1(中断失败)/*** 微信公众号:Java技术栈*/ private static void test1() {Thread thread = new Thread(() -> {while (true) {Thread.yield();}});thread.start();thread.interrupt(); }
请问示例1中的线程会被中断吗?答案:不会,因为虽然给线程发出了中断信号,但程序中并没有响应中断信号的逻辑,所以程序不会有任何反应。继续原样执行。跟没有中断是一样的。
示例2:(中断成功)/*** 微信公众号:Java技术栈*/ private static void test2() {Thread thread = new Thread(() -> {while (true) {Thread.yield();// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}}});thread.start();thread.interrupt(); }
我们给示例2加上了响应中断的逻辑,程序接收到中断信号打印出信息后返回退出。return退出。
示例3(中断失败)/*** 微信公众号:Java技术栈*/ private static void test3() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技术栈线程休眠被中断,程序退出。");}}});thread.start();Thread.sleep(2000);thread.interrupt(); }
可以看出 sleep() 方法被中断后会清除中断标记,所以循环会继续运行。
示例4(中断成功)/*** 微信公众号:Java技术栈*/ private static void test4() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技术栈线程休眠被中断,程序退出。");Thread.currentThread().interrupt();}}});thread.start();Thread.sleep(2000);thread.interrupt(); }
示例4全部信息输出并正常退出,只是在 sleep() 方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。
我们的系统肯定有些线程为了保证业务需要是要常驻后台的,一般它们不会自己终止,需要我们通过手动来终止它们。我们知道启动一个线程是start方法,自然有一个对应的终止线程的stop方法,通过stop方法可以很快速、方便地终止一个线程。
通过注解@Deprecated看出stop方法被标为废弃的方法,jdk在以后的版本中可能被移除,不建议大家使用这种API。
那为什么这么好的一个方法怎么不推荐使用,还要标注为废弃呢?
假设有这样的一个业务场景,一个线程正在处理一个复杂的业务流程,突然间线程被调用stop而意外终止,这个业务数据还有可能是一致的吗?这样是肯定会出问题的,stop会释放锁并强制终止线程,造成执行一半的线程终止,带来的后果也是可想而知的,这就是为什么jdk不推荐使用stop终止线程的方法的原因,因为它很暴力会带来数据不一致性的问题。
正因为stop方法太过暴力,所以一般不推荐使用,除非你非常清楚你自己的业务场景,用stop终止不会给你的业务带来影响。
说了这么多,那如何优雅地终止一个线程呢?看看下面的程序。
其实也不难,只需要添加一个变量,判断这个变量在某个值的时候就退出循环,这时候每个循环为一个整合不被强行终止就不会影响单个业务的执行结果。
转载于:https://www.cnblogs.com/yaowen/p/11278907.html
hread.interrupt()到底意味着什么相关推荐
- 互联网时代的B2B电商系统到底意味着什么
互联网时代,很多企业纷纷想要开展属于自己的业务,可是在当下的电商体系当中,B2B电商系统是发展最快最成熟的一种电商模式,其中使用数 商 云 电商系统是当下比较流行的一种模式,想要知道更多的B2B电商系 ...
- 数字化改造转型到底意味着什么
数字化改造转型这一周期性的热门术语再度火爆,但大多数人不明白其真正的实力所在. 数字化改造转型,又名DX,在时下是相当热的--而如果您不这样做,您所在的公司会被淘汰,而您自己也或将失去您的CIO或IT ...
- 认真工作对自己到底意味着什么?
现在年轻人当中有一种旺盛的倾向在滋长,那就是厌恶工作,逃避责任,甚至会对积极工作的人报以嘲笑,人们越来越追求轻松挣钱,且最好是不劳而获,及时行乐,哪怕是得过且过的生活状态.这不仅让我们去思考,人类年轻 ...
- 拆分大科技公司到底意味着什么?
许多对当今庞大科技公司的批评者越来越有信任情绪,但尚不清楚该采取什么措施来缩小它们的规模. 对于苹果.亚马逊.脸书和谷歌来说,covid-19是经济上的福音.尽管流感大流行导致全球经济陷入深度衰退,并 ...
- Fuchsia 对 Android 到底意味着什么?
Google 总是以自己的方式来解决或者做一些事情.因此,当他们开始做一些让人摸不着头脑的举动时,大家也不会太奇怪.该项目被称为 Fuschia. 大多数密切关注 Google 和 Android 的 ...
- 最小可行产品是什么_无论如何,“最小可行产品”到底意味着什么?
最小可行产品是什么 by Ravi Vadrevu 通过拉维·瓦德雷武(Ravi Vadrevu) 无论如何,"最小可行产品"实际上是什么意思? (What does " ...
- 协方差意味着什么_“零”到底意味着什么?
协方差意味着什么 When I was an undergraduate student studying Data Science, one of my professors always aske ...
- 广州的11个辖区_重庆前三季度GDP反超广州,这对两城到底意味着什么?
最近各省市相继公布了各地区前三季度的GDP发展情况,有两个城市备受关注: 重庆和广州. 在2019年城市GDP排行榜上重庆仅落后广州不到30亿元,彼时"北上广深"变"北上 ...
- foo java_Java的类型参数通配符到底意味着什么? Foo和Foo ?之间的真正区别是什么?...
对于通用接口: public interface Foo { void f(T t); } 两个字段之间的区别: public class Bar { Foo foo1; Foo> foo2; ...
- 自由到底意味着什么(二)叔本华说的第一类自由
目录 一.叔本华说的第一类自由 二.当自由纯粹到一定程度,便与孤独等同了 三.<一切都在孤独里成全>这本书说 一.叔本华说的第一类自由 叔本华在<伦理学的两个基本问题>中对自由 ...
最新文章
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...
- c语言分隔符分离出str字符串中的数字,C语言版Tokenize()函数,由分隔符获取字符串...
- 因子和(类素数筛选法)
- Linq to xml:使用 XSLT 转换 XML 树
- XCTF-MISC-新手区:stegano
- 【背包】SMRTFUN
- 延时加载 lazyload使用技巧
- English Corpora - 英语语料库
- 移远BC35-GBC28BC95调试 步骤:从上电到发送一个http请求收到响应
- Navivat 中快速快捷查找表和数据
- mysql实现周月表_按天周月统计数据
- 功能测试与性能测试常见方法
- Flutter 仿滴滴出行App,2021最新华为Android校招面试题
- win10多任务处理快捷键
- 用Python计算现在距离春节还剩多长时间
- CSP-J CSP-S 初赛模拟题
- python中的openpyxl模块
- Gauss 消元法矩阵LU分解
- 多种计算机编程语言简介
- 什么的发明使研制着能够成功研制微型计算机,1_1_科普知识竞赛试题(小学)