原创,请勿转载~
涉及到2个概念,许可证(permit)和中断状态(interrupt status)
中断状态比较容易理解,每个线程都有一个中断状态的标识,调用interrupt方法,即可设置此标识。
许可证是park和unpark才牵扯到的概念。
如果有许可证,park立即返回,如果中断状态已设置,park也立即返回。
park会消耗许可证,不会清除中断状态
unpark会生成一个许可证
unpak可以在park之前先调用,生成一个许可证,之后调用park的时候回消耗掉这个许可证,并立即返回
每个线程,最多只有一个许可证,多次调用unpark,也只是生成一个许可证
wait和notify之间没有“许可证”这种概念
在wait之前的notify都是无效的。
如果中断状态已设置,则wait清除中断状态,并立即返回。
interrupt方法,不只设置中断状态这个标识,也会调用unpark方法。
因此,调用interrupt之后,此线程的中断状态被设置,且会生成许可证。
wait,join,sleep都会清除中断状态,其余情况(park等),都不会清除中断状态。