首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。

所以,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()到底意味着什么相关推荐

  1. 互联网时代的B2B电商系统到底意味着什么

    互联网时代,很多企业纷纷想要开展属于自己的业务,可是在当下的电商体系当中,B2B电商系统是发展最快最成熟的一种电商模式,其中使用数 商 云 电商系统是当下比较流行的一种模式,想要知道更多的B2B电商系 ...

  2. 数字化改造转型到底意味着什么

    数字化改造转型这一周期性的热门术语再度火爆,但大多数人不明白其真正的实力所在. 数字化改造转型,又名DX,在时下是相当热的--而如果您不这样做,您所在的公司会被淘汰,而您自己也或将失去您的CIO或IT ...

  3. 认真工作对自己到底意味着什么?

    现在年轻人当中有一种旺盛的倾向在滋长,那就是厌恶工作,逃避责任,甚至会对积极工作的人报以嘲笑,人们越来越追求轻松挣钱,且最好是不劳而获,及时行乐,哪怕是得过且过的生活状态.这不仅让我们去思考,人类年轻 ...

  4. 拆分大科技公司到底意味着什么?

    许多对当今庞大科技公司的批评者越来越有信任情绪,但尚不清楚该采取什么措施来缩小它们的规模. 对于苹果.亚马逊.脸书和谷歌来说,covid-19是经济上的福音.尽管流感大流行导致全球经济陷入深度衰退,并 ...

  5. Fuchsia 对 Android 到底意味着什么?

    Google 总是以自己的方式来解决或者做一些事情.因此,当他们开始做一些让人摸不着头脑的举动时,大家也不会太奇怪.该项目被称为 Fuschia. 大多数密切关注 Google 和 Android 的 ...

  6. 最小可行产品是什么_无论如何,“最小可行产品”到底意味着什么?

    最小可行产品是什么 by Ravi Vadrevu 通过拉维·瓦德雷武(Ravi Vadrevu) 无论如何,"最小可行产品"实际上是什么意思? (What does " ...

  7. 协方差意味着什么_“零”到底意味着什么?

    协方差意味着什么 When I was an undergraduate student studying Data Science, one of my professors always aske ...

  8. 广州的11个辖区_重庆前三季度GDP反超广州,这对两城到底意味着什么?

    最近各省市相继公布了各地区前三季度的GDP发展情况,有两个城市备受关注: 重庆和广州. 在2019年城市GDP排行榜上重庆仅落后广州不到30亿元,彼时"北上广深"变"北上 ...

  9. foo java_Java的类型参数通配符到底意味着什么? Foo和Foo ?之间的真正区别是什么?...

    对于通用接口: public interface Foo { void f(T t); } 两个字段之间的区别: public class Bar { Foo foo1; Foo> foo2; ...

  10. 自由到底意味着什么(二)叔本华说的第一类自由

    目录 一.叔本华说的第一类自由 二.当自由纯粹到一定程度,便与孤独等同了 三.<一切都在孤独里成全>这本书说 一.叔本华说的第一类自由 叔本华在<伦理学的两个基本问题>中对自由 ...

最新文章

  1. #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  2. 数组运用_1-19 编程练习
  3. 关于jsp页面是放在webroot目录下和web-inf下优缺点
  4. chrome调试找不到 XXXX.min.map 原因及解决办法
  5. 北航和哈佛研发软体机器人,抓住各类物体!
  6. [SDOI2014]旅行
  7. 甘肃政法学院计算机科学与技术试题,甘肃政法学院计算机科学与技术专业课程教学大纲.doc...
  8. Ubuntu18.04 LTS Melodic ROS 教程:使用URDF创建一个虚拟机器人模型
  9. e5 e3 php,硬件百科:E3/E5为什么让“垃圾佬”痴迷
  10. STM32工作笔记0062---定时器中断实验
  11. VR/AR平台战略与实践(1)
  12. 关于DevEco Studio踩过的各种坑~
  13. 图相处理自学(一):数字图像基本概念
  14. 华为云 如何使用华为云提供的Ubuntu镜像源
  15. (2022杭电多校三)1002-Boss Rush(状压DP+二分)
  16. 《流浪地球》海报丨见证小破球24亿票房逆袭之路
  17. 【GZH逸佳君】:送你300集基础AI教程+6套高级设计教程+20G素材,学会就能做设计
  18. JavaWeb(9) I18N国际化
  19. 【Kaggle竞赛树叶分类Baseline】上万片树叶分为一百七十六类
  20. 模块独立(耦合性与内聚性)

热门文章

  1. ARKit Plane Detection (平面检测)
  2. 如何用 Bash 创建一个二进制发布包
  3. 上拉刷新下拉加载PullToRefreshLayout
  4. 2016 Multi-University Training Contest 10
  5. SQL Server | Mysql 对表的unique 的实现方式
  6. TP-LINK 无线路由器桥接步骤
  7. mac 安装php swoole扩展
  8. java中动态代理的使用
  9. 计算机网络(1)--计算机网络和因特网
  10. JavaWeb——Servlet开发1