并发与多线程【三】——线程状态转换

引言

线程是 JVM 执行任务的最小单元,理解线程的状态转换是理解多线程问题的基础。在 JVM 运行中,线程共有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。这些状态对应 Thread.state 枚举类中的状态。

线程状态转换

如下图所示,当创建一个线程时,线程处在 NEW 状态,运行 Thread 的 start 方法后,线程进入 RUNNABLE 可运行状态。

 

这时,所有可运行状态的线程并不能马上运行,而是需要先进入就绪状态(READY)等待线程调度,如图中间所示的 READY 状态。

在获取 CPU 之后才能进入运行状态(RUNNING),如图中所示的 RUNNING 状态。

运行状态可以随着不同条件转换成除 NEW 以外的其他状态。

如图左侧所示,在运行状态中的线程进入 synchronized 同步块或同步方法时,如果获取锁失败,则会进入 BLOCKED 状态。当获取到锁后,会从 BLOCKED 状态恢复到 READY 状态。

如图右侧所示,运行中的线程还会进入等待状态,这两个状态一个是有超时时间的等待,例如调用 Object.wait、Thread.join 等;另一个是没有超时的等待,例如调用 Thread.join、LockSupport.park等。这两种状态都可以通过 notify 或 unpark 结束等待状态并恢复到就绪状态。

最后是线程运行完成结束时,如图中下侧所示,线程状态变成 TERMINATED。

 

扩展

可以参考另一篇带代码的:https://blog.csdn.net/cisco_huang/article/details/87251768

 

posted @ 2020-02-18 12:05  习惯沉淀  阅读(322)  评论(0编辑  收藏  举报