写点什么

【高并发】又一个朋友面试栽在了 Thread 类的 stop() 方法和 interrupt() 方法上!

作者:冰河
  • 2022 年 6 月 07 日
  • 本文字数:1188 字

    阅读完需:约 4 分钟

【高并发】又一个朋友面试栽在了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()方法, 来检测自己是不是被中断了。

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。


最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。



发布于: 22 小时前阅读数: 28
用户头像

冰河

关注

公众号:冰河技术,专注写硬核技术专栏。 2020.05.29 加入

互联网资深技术专家,《深入理解分布式事务:原理与实战》,《海量数据处理与大数据技术实战》和《MySQL技术大全:开发、优化与运维实战》作者,mykit-data与mykit-transaction-message框架作者。【冰河技术】作者。

评论

发布
暂无评论
【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!_并发编程_冰河_InfoQ写作社区