写点什么

据说有人面试栽在了 Thread 类的 stop() 方法和 interrupt() 方法上

  • 2022 年 1 月 06 日
  • 本文字数:1051 字

    阅读完需:约 3 分钟

摘要:今天就简单的说说 Thread 类的 stop()方法和 interrupt()方法到底有啥区别。

 

本文分享自华为云社区《【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!》,作者: 冰 河。

 

一个工作了几年的朋友今天打电话和我聊天,说前段时间出去面试,面试官问他做过的项目,他讲起业务来那是头头是道,犹如滔滔江水连绵不绝,可面试官最后问了一个问题:Thread 类的 stop()方法和 interrupt 方法有啥区别。这一问不要紧,当场把那个朋友打懵了!结果可想而知。。。


事后,我也是感慨颇多,现在的程序员只知道做些简单的 CRUD 吗?哎,不多说了,今天就简单的说说 Thread 类的 stop()方法和 interrupt()方法到底有啥区别吧!

stop()方法


stop()方法会真的杀死线程。如果线程持有 ReentrantLock 锁,被 stop()的线程并不会自动调用 ReentrantLock 的 unlock()去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁, 这样其他线程就再也不能执行 ReentrantLock 锁锁住的代码逻辑。 所以该方法就不建议使用了, 类似的方法还有 suspend()和 resume()方法, 这两个方法同样也都不建议使用了, 所以这里也就不多介绍了。

interrupt()方法


interrupt()方法仅仅是通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知。被 interrupt 的线程,有两种方式接收通知:一种是异常, 另一种是主动检测。

通过异常接收通知


当线程 A 处于 WAITING、 TIMED_WAITING 状态时, 如果其他线程调用线程 A 的 interrupt()方法,则会使线程 A 返回到 RUNNABLE 状态,同时线程 A 的代码会触发 InterruptedException 异常。线程转换到 WAITING、TIMED_WAITING 状态的触发条件,都是调用了类似 wait()、join()、sleep()这样的方法, 我们看这些方法的签名时,发现都会 throws InterruptedException 这个异常。这个异常的触发条件就是:其他线程调用了该线程的 interrupt()方法。


当线程 A 处于 RUNNABLE 状态时,并且阻塞在 java.nio.channels.InterruptibleChannel 上时, 如果其他线程调用线程 A 的 interrupt()方法,线程 A 会触发 java.nio.channels.ClosedByInterruptException 这个异常;当阻塞在 java.nio.channels.Selector 上时,如果其他线程调用线程 A 的 interrupt()方法,线程 A 的 java.nio.channels.Selector 会立即返回。

主动检测通知


如果线程处于 RUNNABLE 状态,并且没有阻塞在某个 I/O 操作上,例如中断计算基因组序列的线程 A,此时就得依赖线程 A 主动检测中断状态了。如果其他线程调用线程 A 的 interrupt()方法, 那么线程 A 可以通过 isInterrupted()方法, 来检测自己是不是被中断了。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
据说有人面试栽在了Thread类的stop()方法和interrupt()方法上