Lazy loaded image
技术分享
🗒️Java线程中断的三种方法
字数 793阅读时长 2 分钟
2020-7-13
2023-10-24
type
status
date
slug
summary
tags
category
icon
password
多线程编程中耗时线程是很常见的情况,有时候我们不得不在一个线程中去终止另一个耗时线程。JDK并不推荐直接停止比如this.stop(),这会导致一些异常,比如锁未释放程序一直死锁。JDK推荐使用一个线程去通知耗时线程该结束线程了,耗时线程做退出前的回收处理然后自己结束线程。

自定义标志位终止

使用volatile 修饰的变量isExit控制线程的退出,这种方法需要不断及时判断isExit的值
输出结果可以看到,线程并未立即终止,结束循环体后才最终结束线程。
notion image

interrupt() 方式终止

正常执行的代码

执行结果
notion image

处于阻塞休眠的代码

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

stop()强行停止

从执行结果可以看到,run方法并未完全执行完就结束了,所以这种方法不推荐使用
notion image

源码分析

Thread源码中使用了一个volatile修饰的标志位控制终止信号
interrupt方法会使标志位变为true
notion image
判断线程是否终止JDK提供了两种方式

this.isInterrupted()

调用isInterrupted会返回该标志位
notion image

Thread.interrupted()

调用interrupted会返回该标志位,如果为ture会将标志位清空,且这个方法为静态方法
notion image
上一篇
面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
下一篇
Java的四种引用:强引用、软引用,弱引用和虚引用

评论
Loading...