type
status
date
slug
summary
tags
category
icon
password
多线程编程中耗时线程是很常见的情况,有时候我们不得不在一个线程中去终止另一个耗时线程。JDK并不推荐直接停止比如this.stop(),这会导致一些异常,比如锁未释放程序一直死锁。JDK推荐使用一个线程去通知耗时线程该结束线程了,耗时线程做退出前的回收处理然后自己结束线程。
自定义标志位终止
使用volatile 修饰的变量isExit控制线程的退出,这种方法需要不断及时判断isExit的值
输出结果可以看到,线程并未立即终止,结束循环体后才最终结束线程。

interrupt() 方式终止
正常执行的代码
执行结果

处于阻塞休眠的代码
这里有点不一样,interrupt()方式中断阻塞会把标志位清除并报出InterruptedException异常,所以要在catch的时候退出。
执行结果

stop()强行停止
从执行结果可以看到,run方法并未完全执行完就结束了,所以这种方法不推荐使用

源码分析
Thread源码中使用了一个volatile修饰的标志位控制终止信号
interrupt方法会使标志位变为true

判断线程是否终止JDK提供了两种方式
this.isInterrupted()
调用isInterrupted会返回该标志位

Thread.interrupted()
调用interrupted会返回该标志位,如果为ture会将标志位清空,且这个方法为静态方法

上一篇
面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
下一篇
Java的四种引用:强引用、软引用,弱引用和虚引用
- 作者:比尔盖子
- 链接:https://www.connorshen.site/article/a8443d49-21f8-4f9c-8c14-051bdc02e0ae
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。