JUC学习-18-线程状态间转换

JUC学习-18-线程状态间转换

一、Blocked进入到Runnable状态

想要从Blocked状态进入Runnable状态,我们上面说过必须要线程获得monitor锁。

image

二、Waiting进入Runnable

只有当执行了LockSupport.unpark(),或者join的线程运行结束,或者被中断时才可以进入Runnable状态。

image

三、Timed Waiting进入Runnable

同样在Timed Waiting中执行notify()notifyAll()也是一样的道理,他们会先进入到Blocked状态,然后抢夺锁成功后,再次回到Runnable状态

但是对于Timed Waiting 而言,它存在超时机制,也就是说如果超时时间到了那么就会系统自动直接拿到锁,或者join的线程执行结束/调用了 LockSupport.unpark()被中断等情况都会直接进入Runnable状态,而不会经历Blocked状态

image

三、总结:

1、线程的状态是按照箭头方向来走的,比如线程从New状态时不可以直接进入到Blocked状态的,它需要先经历Runnable状态

2、线程生命周期不可逆:一旦进入Runnable状态就不能回到New状态;一旦被终止就不可能再有任何状态的变化

3、所以一个线程只能有一次NewTerminated状态,只有处于中间状态才可以相互转换。也就是这两个状态不会参与互相转化

posted @ 2025-07-15 09:00  skystrivegao  阅读(9)  评论(0)    收藏  举报