线程包括哪些状态,状态之间是如何变化?
发布于 2024-07-17
740
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
线程状态及变化摘要
1. 线程状态 - 六种状态
在 Java 中,线程状态可以参考 JDK 中的 Thread 类中的枚举 State,包括以下六种状态:
-
新建 (NEW): 线程对象被创建但未调用
start方法,尚未与操作系统底层线程关联。 -
可运行 (RUNNABLE): 调用
start方法后进入可运行状态,与底层线程关联,由操作系统调度执行。 - 终结 (TERMINATED): 线程代码执行完毕后进入终结状态,与底层线程取消关联。
- 阻塞 (BLOCKED): 线程获取锁失败后进入阻塞队列,不占用 CPU 时间,持锁线程释放锁后唤醒,恢复至可运行状态。
-
等待 (WAITING): 线程因条件不满足调用
wait()方法进入等待集合等待,需通过notify()或notifyAll()唤醒。 -
有时限等待 (TIMED_WAITING): 线程调用
wait(long)或sleep(long)方法进入有时限等待状态,超时或被唤醒后恢复至可运行状态。
2. 线程状态 - 五种状态
从操作系统层面,线程可以划分为以下五种状态:
- 运行态: 分配到 CPU 时间,线程真正执行代码。
- 就绪态: 有资格分到 CPU 时间,但尚未轮到执行。
- 阻塞态: 无资格分配到 CPU 时间,包括阻塞、等待、有时限等待和阻塞 I/O。
- 新建态: 与 Java 中的新建状态类似。
- 终结态: 与 Java 中的终结状态类似。
3. wait 和 sleep 方法的不同
两者的相同点是都会让当前线程暂时放弃 CPU 使用权,但在以下方面存在不同:
-
方法归属:
sleep是Thread的静态方法,而wait是Object的成员方法。 -
醒来时机:
sleep按超时时间自然醒来;wait需被notify唤醒或超时醒来。 -
锁特性:
wait方法会释放对象锁,而sleep不释放锁。
4. 面试问题总结
面试常见问题是关于线程状态及其相互转换。主要状态包括新建、可运行、终结、阻塞、等待和有时限等待。状态转换涉及:
- 从新建到可运行:调用
start方法。 - 从可运行到终结:线程代码执行完毕。
- 从可运行到阻塞:获取锁失败,进入阻塞队列。
- 从可运行到等待:条件不满足调用
wait()方法。 - 从可运行到有时限等待:调用
wait(long)或sleep(long)方法。
希望本文对您有所帮助,欢迎点赞、收藏或分享支持!
springboot葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线