线程包括哪些状态,状态之间是如何变化?
发布于 2024-07-17


版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。


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葵花宝典的其他文章
Spring中 @Controller和@RestController区别
Spring中 @Controller和@RestController区别
MySQL索引:提升数据库性能的关键利器
为了提高数据库的性能和查询效率,MySQL索引是一个不可或缺的工具。本文将深入探讨MySQL索引的概念、类型、结构。
SpringBoot-23-全局异常机制+RESTful统一规范
SpringBoot-23-全局异常机制+RESTful统一规范
SpringBoot实现全局异常处理总结
今天主要讲解了@ControllerAdvice+@ExceptionHandler进行统一的在Controller层上的全局异常处理
Java并发篇面试总结
1. 线程状态
要求
掌握 Java 线程六种状态
掌握 Java
加入社区微信群
与行业大咖零距离交流学习


PMO实践白皮书
白皮书上线
白皮书上线