🌟 欢迎来到 我的博客! 🌈
💡 探索未知, 分享知识 !💫

本文目录
- 🌟1. 引言
 - 🌟2. Java线程的生命周期
 - 💡2.1 <font color= "skyblue">新建(New)
 - 💡2.2 <font color= "red">可运行(Runnable)
 - 💡2.3 <font color= "#D2691E">阻塞(Blocked)
 - 💡2.4 <font color= "#FFA500">等待(Waiting)
 - 💡2.5 <font color= "#FFC0CB">计时等待(Timed Waiting)
 - 💡2.6 <font color= "#CD5C5C">终止(Terminated)
 
- 🌟3. 状态转换
 - 🌟4. 图解
 
🌟1. 引言
在Java中,线程对于同时执行单个进程中的多个任务至关重要。深入理解线程状态及其管理对于开发高效、可靠且并发的应用程序至关重要。本博客文章探讨了Java中线程的各种状态、它们的含义以及线程在这些状态之间转换的条件。
🌟2. Java线程的生命周期
下面的这六种状态代表了线程执行生命周期的不同阶段。让我们深入了解每个状态及其重要性:
💡2.1 新建(New)
当线程已经被创建但start()方法尚未被调用时,线程处于新建状态。此时,线程还没有活跃,不能运行任何代码。
就像刚出生的婴儿一样,线程被创建了,但还没开始工作。这时候,它就在那躺着,等着被告知要开始干活。
💡2.2 可运行(Runnable)
一旦调用了线程的start()方法,它就转变为可运行状态。处于此状态的线程要么正在Java虚拟机(JVM)中执行,要么正在等待被线程调度器选中执行。它将一直保持此状态,直到被线程调度器选择执行。
就是线程被告知可以开始工作了 !(就是调用了
start()方法),然后它就跳到了“准备好了,随时可以干活”的状态(或者已经在执行中的状态)。现在,它就等着被分配任务,随时准备开始执行。
💡2.3 阻塞(Blocked)
当线程等待获取一个锁以便进入或重新进入一个同步块/方法时,它进入阻塞状态。一旦它获取到锁,就会再次变为可运行状态。
这时,它就像是被挡在了门外,等待进入的许可。
💡2.4 等待(Waiting)
当线程因等待另一个线程执行特定动作而无限期等待时,进入等待状态。导致这种情况的动作包括没有超时的Object.wait()、Thread.join()在另一个线程上。直到另一个线程在被等待的对象上调用notify()或notifyAll(),才会变为可运行状态, 不然线程将会一直保持此状态。
💡2.5 计时等待(Timed Waiting)
计时等待状态类似于等待状态,但有指定的等待时间。线程由于调用Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis)进入此状态。当等待时间到期或等待的事件发生时,线程将返回到可运行状态。
| 这个状态和等待差不多,但线程会设置个闹钟,就比如生活中“我等10分钟,如果还没轮到我,我就不等了”。 | 
💡2.6 终止(Terminated)
当线程已完成其执行或已被强制终止时,它处于终止状态。这是线程生命周期中的最终阶段。
🌟3. 状态转换
这些状态之间的转换由特定条件或动作控制:
新建=>可运行:在线程上调用 start() 方法。可运行=>阻塞:尝试进入由另一个线程锁定的同步块/方法。阻塞=>可运行:在另一个线程释放锁之后获取到锁。可运行=>等待/计时等待:调用如wait()、join() 或 sleep() 等方法。等待/计时等待=>可运行:等待结束的条件得到满足,如notify()、notifyAll()或超时过期。任何状态=>终止:run方法的完成或由于未捕获的异常突然终止。
🌟4. 图解

 图片摘自https://blog.csdn.net/sspudding/article/details/89220595













![[CSAWQual 2019]Web_Unagi ---不会编程的崽](https://img-blog.csdnimg.cn/direct/944a253cafd94adfbd956d3de7361107.png)





