并发编程——如何终止线程

文章图片
今天简单的讲一讲如何终止线程 。
如果对于线程的创建方式不太了解 , 推荐观看并发编程——认识java里的线程
对于线程状态及其切换不了解的 , 推荐观看并发编程——Java线程的6种状态及切换
对于线程的启动不了解的 , 推荐观看并发编程——线程的启动
终止线程
终止线程的方式
1、使用标记变量
我们通过继承Thread来创建一个自定义的线程类 , 里面live这个属性是用来控制线程是否终止
文章图片
使用main方法去测试 , 启动线程 , 然后延迟20毫秒 , 然后我们去改变这个live , 使其跳出循环 , 继续往下走 , 执行完run , 达到一个线程自然执行完终止的效果 。 
文章图片
下面是执行结果 , 看到结果如我们预想的那样 , 跳出循环之后 , 现成终止 。 
文章图片
2、使用stop方法
首先看一下stop的源码 , 我们发现这个方法使用了@Deprecated注解 , 表示不推荐使用 , 是被废除的 。
这个方法目前还是能够达到终止线程的目的 , 但是这个方法是不安全的 , 或者说是比较暴力的中断执行 , 导致是代码不能执行完 , 逻辑不完整 , 而且会释放所有锁资源 , 影响原子操作 , 数据不一致问题 。 所以如果你不知道当前线程的一些执行情况 , 占用资源的情况的话 , 还是不推荐使用 。
JDK文档中还引入用一篇文章来解释了弃用这些方法的原因:《WhyareThread.stop,Thread.suspendandThread.resumeDeprecated?》
为什么弃用stop:
调用stop方法会立刻停止run方法中剩余的全部工作 , 包括在catch或finally语句中的 , 并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获) , 因此可能会导致一些清理性的工作的得不到完成 , 如文件 , 数据库等的关闭 。
调用stop方法会立即释放该线程所持有的所有的锁 , 导致数据得不到同步 , 出现数据不一致的问题 。 
文章图片
3、使用interrupt方法
跟interrupt在Thread类中相关的有三个方法 , 分别是interrupt,interrupted,isInterrupted 。
下面来分析一下这三个方法的区别 , 以及用法 。
isInterrupted
通过面向对象思想我们大概就能猜出来 , 再看到它的返回值是一个boolean类型 , 那就十之八九能知道这个方法就是获取当前这个中断信号的值是什么 。 
文章图片
继续深入点进去发现调用的是一个native本地方法 , 接收一个是否清除Interrupted标志位的参数 , isInterrupted传递过来的是一个false,说明不会去清除Interrupted标志位 。
下面测试结果发现这个方法会在中断线程之后 , 不会对Interrupted标志位做清除工作 , 还是true 。 
文章图片
interrupted
首先我们看到这个方法是一个静态方法 , interrupted也调用了isInterrupted(true)方法 , 不过它传递的参数是true , 表示将会清除中断标志位 。
下面测试结果发现这个方法会在中断线程之后 , 会将Interrupted标志位清除 , 发现清除之后的结果为false 。 
文章图片
interrupt
前面两个是判断是否中断的方法 , 而interrupt就是真正触发中断的方法 。
- |强劲送风,满足你对美感的挑剔—洛斐有范S桌面风扇
- 编程|测试人员对编程天生“恐惧”么?
- 隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?
- 编程|打造Web3.0基础设施 百度瞄准元宇宙的“人货场”?
- 你甩不掉的伴侣——AEROPEXAS800初体验
- 趋势雷达|行业流行力——《新锐美妆种草看点》
- 社交平台cookie出卖了你——木马FFdroider欲窃取你的账户信息丨大东话安全
- 电子商务|广州蓝景分享 — 给刚入职前端\大佬\们的一些建议
- 开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码
- 三星|三星 S22 Ultra——硬件上的机皇,系统体验两极分化
