其他分享
首页 > 其他分享> > 总算把线程六种状态的转换说清楚了!

总算把线程六种状态的转换说清楚了!

作者:互联网






在我们接触编程时,就开始接触各种生命周期,比如对象的生命周期,程序的生命周期等等,对于线程来说也是存在自己的生命周期,而且这也是面试与我们深入了解多线程必备的知识,今天我们主要介绍线程的生命周期及其各种状态的转换。

线程的六种状态

线程的生命周期主要有以下六种状态:


在我们程序编码中如果想要确定线程当前的状态,可以通过getState()方法来获取,同时我们需要注意任何线程在任何时刻都只能是处于一种状态。


New 新建状态

Runnable 可运行状态



**阻塞状态**

Blocked 被阻塞状态


Waiting 等待状态


上面我们看完阻塞状态,那么接下来我们了解一下 Waiting 状态,对于 Waiting 状态的进入有三种情况,如下图中所示,分别为:

Waiting 等待状态

关于 LockSupport.park() 方法,这里说一下,我们通过上面知道 Blocked 是针对 synchronized monitor 锁的,但是在 Java 中实际是有很多其他锁的,比如 ReentrantLock 等,在这些锁中,如果线程没有获取到锁则会直接进入 Waiting 状态,其实这种本质上它就是执行了 LockSupport.park() 方法进入了Waiting 状态

Timed Waiting 计时等待状态




通过上述图我们可以看到在以下情况会让线程进入 Timed Waiting 状态。

通过这个我们可以进一步看到它与 waiting 状态的相同

线程状态间转换

上面我们讲了各自状态的特点和运行状态进入相应状态的情况 ,那么接下来我们将来分析各自状态之间的转换,其实主要就是 BlockedwaitingTimed Waiting 三种状态的转换 ,以及他们是如何进入下一状态最终进入 Runnable


Blocked 进入 Runnable

如下图中紫色加粗表示线路:



Waiting 进入 Runnable


这里大家一定要注意这点,当我们通过 notify 唤醒时,是先进入阻塞状态的 ,再等抢夺到 monitor 锁喉才会进入 Runnable 状态!



**`Timed Waiting` 进入 `Runnable`**



Terminated 终止


最后我们来说最后一种状态,Terminated 终止状态,要想进入这个状态有两种可能。

总结

最后我们说一下再看线程转换的过程中一定要注意两点:



本文由AnonyStar 发布,可转载但需声明原文出处。
欢迎关注微信公账号 :云栖简码 获取更多优质文章
更多文章关注笔者博客 :云栖简码 i-code.online

标签:状态,Runnable,总算,六种,Waiting,线程,进入,Blocked
来源: https://www.cnblogs.com/i-code/p/13839020.html