据说有人面试栽在了 Thread 类的 stop() 方法和 interrupt() 方法上
摘要:今天就简单的说说 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()方法, 来检测自己是不是被中断了。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/d878dacb195bb4ea743ab1219】。文章转载请联系作者。
评论