Java线程的生命周期分为五个主要阶段:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Terminated)。每个阶段都有其特定的含义和状态转换条件,下面详细介绍每个阶段:
-
新建(New)
- 定义:线程被创建但尚未开始执行。可以通过创建
Thread类的实例来进入此状态。 - 代码示例:
java
复制代码
Thread thread = new Thread(() -> System.out.println("Thread is running")); - 特点:此时线程已经在程序中存在,但还未调用
start()方法开始执行任务。
- 定义:线程被创建但尚未开始执行。可以通过创建
-
就绪(Runnable)
- 定义:调用
start()方法后,线程进入就绪状态,等待CPU调度执行。 - 代码示例:
java
复制代码
thread.start(); // 线程进入就绪状态 - 特点:在就绪状态中,线程已经具备执行条件,等待操作系统的调度。此时,线程可能随时进入运行状态,但并没有立即获得CPU的执行权。
- 定义:调用
-
运行(Running)
- 定义:一旦线程获得CPU时间片,开始执行其
run()方法的代码,即进入运行状态。 - 特点:此时线程真正执行任务中的代码。线程的生命周期主要体现在运行阶段,因为执行代码的进展会根据逻辑控制可能会导致状态转换,比如进入阻塞、死亡等状态。
- 注意:线程的运行时间取决于操作系统的调度,不受程序控制。可能会因为CPU时间片用完而被暂停,让其他线程运行。
- 定义:一旦线程获得CPU时间片,开始执行其
-
阻塞(Blocked)
- 定义:线程因等待资源(如等待I/O、锁等)而暂时停止执行的状态。
- 代码示例:
java
复制代码
synchronized (lock) { // 这里线程获得了锁 } - 特点:在阻塞状态下,线程不占用CPU资源,等待满足条件才能进入就绪状态。阻塞状态的原因可能有以下几种:
- 等待阻塞:调用
wait()方法使线程等待条件,直到notify()或notifyAll()方法唤醒它。 - 同步阻塞:线程尝试获取同步锁时,如果锁已被其他线程占用,则进入阻塞状态。
- 其他阻塞:如调用
sleep()方法或等待IO等。
- 等待阻塞:调用
-
死亡(Terminated)
- 定义:线程的生命周期结束,进入死亡状态。
- 死亡原因:
run()方法正常执行完毕,线程自然死亡。- 执行过程中抛出未捕获的异常导致线程意外终止。
- 特点:一旦线程进入死亡状态,就无法重新启动。
状态转换总结
- New -> Runnable:线程通过调用
start()方法进入就绪状态。 - Runnable -> Running:线程被CPU调度并开始执行。
- Running -> Blocked:线程遇到等待的资源时进入阻塞状态。
- Blocked -> Runnable:等待的资源满足条件或阻塞解除,线程重新回到就绪状态。
- Running -> Terminated:线程执行完毕或因异常终止,生命周期结束。
这种状态控制有助于优化系统的资源调度,使得多线程在Java中能够合理、高效地执行不同任务。
2300

被折叠的 条评论
为什么被折叠?



