🌟 欢迎来到 我的博客! 🌈
💡 探索未知, 分享知识 !💫
本文目录
- 🌟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