Java多线程 -- JUC包源码分析7 -- 对Interrupt的深刻理解

时间:2022-09-21 10:00:37

在前面的源码分析中,很多地方用到了Interrupt,在此,对Interrupt做一个深刻总结。

一、“中断“这个词有误区,它并不是真的中断一个线程,准备说,应该叫做“中断轻量级阻塞”。

什么叫“轻量级阻塞”呢?
就是调用以下这几个函数,所造成的线程阻塞。此时线程是处于Waiting状态,会响应t.interrupt。响应方式,前4个,是直接抛出InterruptException异常,最后1个,是线程被唤醒。
sleep/join/wait/await/LockSupport.park

什么叫“重量级阻塞”呢?
synchronzied, lock,这2个不会响应中断。但有点区别: synchronized会使线程处于Blocked状态,lock会使线程处于Waiting状态,因为lock内部用的LockSupport.park.

二、当你的线程正在正常运行时,这个时候调用t.interrupt,除了给该线程置了一个标志位,其他什么反应都没有。

那什么时候,这个标志位会起作用呢?后续线程调用上面的“轻量级阻塞”函数,会起作用。

三、总结: 中断,其实是提供了一种线程在”轻量级阻塞“状态下,可以被唤醒的机制。
因此中断通常都会和轻量级阻塞一起使用,很少会单独使用。

附:interrupt相关的3个函数
t.interrupt() //发中断信号
t.isInterrupted() //只是判断自己是否被中断
Thread.interrupted() //判断,并且重置标志位