您现在的位置是:java学习笔记 >
java学习笔记
[5个阶段] java线程的生命周期有几个阶段?
本 文 目 录
Java线程的生命周期及其阶段
在Java编程中,线程是程序执行流程中的基本单元,它负责执行特定任务。Java线程在其生命周期中有五个明确的阶段,每个阶段都对应着线程状态的变化。理解这些阶段对于有效地管理并发和多线程至关重要。
1. 新建(New)阶段
在创建线程对象时,线程进入新建阶段。通过实现Runnable
接口或继承Thread
类并实例化一个对象即可创建线程。例如:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 线程执行的任务
}
});
此时,线程并未开始执行,只是已经具备了执行的条件。
2. 就绪(Runnable)阶段
当调用线程对象的start()
方法后,线程进入就绪状态,等待被JVM调度器选中。这意味着线程可以随时开始运行,但实际是否运行取决于操作系统的线程调度策略。
thread.start();
3. 运行(Running)阶段
若线程从就绪队列中被调度器选中,则该线程进入运行状态,开始执行其run()
方法中的代码。同一时刻,可能有多个线程处于运行状态,也可能只有一个。
4. 阻塞(Blocked/Waiting/Timed Waiting)阶段
当线程在运行过程中遇到以下情况之一时,将进入阻塞状态:
- 等待获取锁资源(Blocked)
- 主动调用
wait()
、sleep()
等方法让出CPU(Waiting或Timed Waiting) - 等待某个条件满足(如
join()
方法)
synchronized (obj) {
obj.wait(); // 进入等待状态
}
5. 终止(Terminated)阶段
线程执行完其run()
方法或者提前调用了stop()
(已废弃)、interrupt()
方法后,线程将结束生命周期,进入终止状态。
// 不推荐使用stop()
// thread.stop();
// 建议使用interrupt()
thread.interrupt();
总结与注意事项:
- Java线程的生命周期包括新建、就绪、运行、阻塞和终止五个阶段。
- 理解每个阶段的意义有助于更好地管理和控制线程行为。
- 注意避免滥用线程操作方法,比如
Thread.stop()
方法由于可能导致资源泄露等问题已经被弃用,推荐使用更安全的中断机制。 - 在设计多线程程序时,需考虑线程间的同步和通信问题,合理利用锁、条件变量等机制。
完整代码示例(简化版):
public class ThreadLifeCycleDemo {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("Thread started");
try {
Thread.sleep(1000); // 让线程进入Timed Waiting状态
} catch (InterruptedException e) {
System.out.println("Thread interrupted");
}
System.out.println("Thread finished execution");
});
thread.start();
// 等待一段时间后中断线程
Thread.sleep(2000);
thread.interrupt();
}
}
上述代码演示了一个简单的Java线程生命周期变化过程,涵盖了新建、就绪、运行、阻塞和终止几个阶段。