JUC学习-18-线程状态间转换
JUC学习-18-线程状态间转换
一、Blocked进入到Runnable状态
想要从Blocked状态进入Runnable状态,我们上面说过必须要线程获得monitor锁。
二、Waiting进入Runnable
只有当执行了LockSupport.unpark(),或者join的线程运行结束,或者被中断时才可以进入Runnable状态。
三、Timed Waiting进入Runnable
同样在Timed Waiting中执行notify() 和notifyAll()也是一样的道理,他们会先进入到Blocked状态,然后抢夺锁成功后,再次回到Runnable状态
但是对于Timed Waiting 而言,它存在超时机制,也就是说如果超时时间到了那么就会系统自动直接拿到锁,或者join的线程执行结束/调用了 LockSupport.unpark()被中断等情况都会直接进入Runnable状态,而不会经历Blocked状态
三、总结:
1、线程的状态是按照箭头方向来走的,比如线程从New状态时不可以直接进入到Blocked状态的,它需要先经历Runnable状态
2、线程生命周期不可逆:一旦进入Runnable状态就不能回到New状态;一旦被终止就不可能再有任何状态的变化
3、所以一个线程只能有一次New和Terminated状态,只有处于中间状态才可以相互转换。也就是这两个状态不会参与互相转化
本文来自博客园,作者:skystrivegao,转载请注明原文链接:https://www.cnblogs.com/skystrive/p/18979069
整理不易,如果对您有所帮助 请点赞收藏,谢谢~