https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=13
1、 新建( new ):新创建了一个
线程对象。
2、 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)
调用了该对象 的
start
()方法。该状态的线程位于可运行线程池中,
等待被线程调度选中,获 取 cpu 的使用权 。
3、 运行( running ):可运行状态( runnable )的线程
获得了
cpu
时间片( timeslice ) ,执行程序代码。
4、 阻塞( block ):阻塞状态是指线程因为某种原因
放弃了
cpu
使用权,也即让出了 cpu timeslice ,
暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。
阻塞的情况分三种:
(一)、 等待阻塞:运行( running )的线程执行 o .
wait
()方法, JVM 会把该线程
放 入等待队列( waitting queue )中。
(二)、 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该
同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
(三)、 其他阻塞: 运行( running )的线程
执行
Thread
.
sleep
(
long
ms
)或
t
.
join
()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞
状态。 当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。
5、 死亡( dead ):线程 run ()、 main () 方法
执行结束,或者因
异常退出了
run
()方法,则该线程结束生命周期。死亡的线程不可再次复生。
![](https://images2017.cnblogs.com/blog/855959/201708/855959-20170823111602464-1587506817.png?x-oss-process=image/resize,w_1400/format,webp)
简单帮助记忆
可以用早起坐地铁来比喻这个过程:
还没起床:sleeping
起床收拾好了,随时可以坐地铁出发:Runnable
等地铁来:Waiting
地铁来了,但要排队上地铁:I/O阻塞
上了地铁,发现暂时没座位:synchronized阻塞
地铁上找到座位:Running
到达目的地:Dead
本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/7417255.html,如需转载请自行联系原作者