并发与多线程【三】——线程状态转换
引言
线程是 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
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!