扫码阅读
手机扫码阅读

线程包括哪些状态,状态之间是如何变化?

322 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. waitsleep 方法的不同

两者的相同点是都会让当前线程暂时放弃 CPU 使用权,但在以下方面存在不同:

  • 方法归属: sleepThread 的静态方法,而 waitObject 的成员方法。
  • 醒来时机: sleep 按超时时间自然醒来;wait 需被 notify 唤醒或超时醒来。
  • 锁特性: wait 方法会释放对象锁,而 sleep 不释放锁。

4. 面试问题总结

面试常见问题是关于线程状态及其相互转换。主要状态包括新建、可运行、终结、阻塞、等待和有时限等待。状态转换涉及:

  • 从新建到可运行:调用 start 方法。
  • 从可运行到终结:线程代码执行完毕。
  • 从可运行到阻塞:获取锁失败,进入阻塞队列。
  • 从可运行到等待:条件不满足调用 wait() 方法。
  • 从可运行到有时限等待:调用 wait(long)sleep(long) 方法。

希望本文对您有所帮助,欢迎点赞、收藏或分享支持!

想要了解更多内容?

查看原文:线程包括哪些状态,状态之间是如何变化?
文章来源:
springboot葵花宝典
扫码关注公众号

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

266 篇文章
浏览 92.4K
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线