Java进阶DAY31-11: 线程的生命周期
线程的生命周期是理解多线程编程中最基本也是最关键的概念之一。在Java中,线程(Thread)的生命周期由创建、启动、运行、阻塞(等待、同步和其他状态)、死亡等几个关键状态构成。理解这些状态及其转换是编写高效、可靠并发程序的基础。
线程生命周期的关键状态
1. 新建(New)
当通过new Thread()
创建一个线程对象时,该线程处于新建状态。此时,它已经分配了必要的资源,如内存,但尚未开始执行。
2. 就绪(Runnable)
调用线程对象的start()
方法后,线程进入就绪状态。就绪状态的线程已经具备了运行的所有条件,只是等待CPU调度。
3. 运行(Running)
线程一旦获取CPU时间片,就会从就绪状态变为运行状态。在运行状态的线程可以执行其run()
方法中定义的代码。
4. 阻塞(Blocked)
线程在执行过程中可能因为各种原因进入阻塞状态。阻塞的原因主要有三种:
- 等待阻塞:通过调用线程的
wait()
方法,使线程等待某个条件满足。 - 同步阻塞:线程在尝试获取锁以进入一个同步块/方法时,但该锁正被其他线程持有。
- 其他阻塞:通过调用线程的
sleep()
或join()
方法,或者等待I/O资源时,线程会进入阻塞状态。
5. 死亡(Terminated)
线程的运行结束,可以是因为run()
方法执行完毕自然死亡,也可以是因为异常结束或者被强制终止(通过调用stop()
方法,但这是不推荐的做法)。
线程状态转换
- 新建到就绪:调用
start()
方法后,线程从新建状态转换到就绪状态。 - 就绪到运行:当线程调度器选择线程执行时,线程从就绪状态转换到运行状态。
- 运行到阻塞:线程因为等待锁、
sleep()
、wait()
或join()
方法等原因进入阻塞状态。 - 阻塞到就绪:阻塞状态结束后,线程重新进入就绪状态,等待CPU调度执行。
- 运行到死亡:线程执行完毕或者因为异常结束其
run()
方法时,进入死亡状态。
示例代码
下面是一个简单的线程示例,展示了线程从创建、启动到运行的过程:
public class ThreadLifecycleDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Running in thread: " + Thread.currentThread().getName());
}
});
System.out.println("Thread state after creation: " + thread.getState()); // NEW
thread.start();
System.out.println("Thread state after calling start(): " + thread.getState()); // RUNNABLE
}
}
在这个例子中,通过打印线程的状态,我们可以观察到线程从新建状态到就绪状态的转换,当线程开始执行时,其状态为RUNNABLE
。
结论
理解线程的生命周期及其状态转换对于编写多线程程序是非常重要的。通过掌握这些基础知识,开发者可以更好地管理线程的创建、执行和终止,编写出更高效、稳定的并发应用程序。