在Java中,线程的生命周期描述了线程从创建到终止的整个过程。
在Java中,线程的生命周期可以分为六种状态:新建状态(New)、可运行状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、等待状态(Waiting)、计时等待状态(Timed Waiting)和终止状态(Terminated)。线程从新建状态开始,通过调用start()
方法进入可运行状态,等待调度器选择运行。运行状态的线程可能因等待锁或I/O操作进入阻塞状态,或通过调用wait()
、join()
等方法进入等待状态。计时等待状态的线程在指定时间后自动恢复。线程的run()
方法执行完毕或因异常终止时,线程进入终止状态。
1. 新建状态(New)
当一个线程对象被创建时,它处于新建状态。此时,线程还没有开始执行。
Thread myThread = new Thread(); // 新建状态
2. 可运行状态(Runnable)
当调用线程的start()
方法时,线程进入可运行状态。在这个状态下,线程已经准备好运行,但具体何时运行由线程调度器决定。
myThread.start(); // 可运行状态
3. 运行状态(Running)
线程调度器选择一个可运行状态的线程并让它运行时,该线程进入运行状态。在这个状态下,线程的run()
方法正在执行。
4. 阻塞状态(Blocked)
线程在某些情况下会进入阻塞状态,例如等待获取一个锁、等待输入/输出操作完成等。阻塞状态的线程不会占用CPU时间。
synchronized (lock) { // 可能进入阻塞状态
// 代码
}
5. 等待状态(Waiting)
线程可以通过调用Object.wait()
、Thread.join()
或LockSupport.park()
等方法进入等待状态。等待状态的线程需要其他线程显式地唤醒。
synchronized (lock) {
lock.wait(); // 进入等待状态
}
6. 计时等待状态(Timed Waiting)
线程可以通过调用带有超时参数的方法进入计时等待状态,例如Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
等。计时等待状态的线程在指定时间后会自动恢复到可运行状态。
Thread.sleep(1000); // 进入计时等待状态
7. 终止状态(Terminated)
线程的run()
方法执行完毕或因未捕获的异常而终止时,线程进入终止状态。此时,线程的生命周期结束,不能再被重新启动。
public void run() {
// 线程执行代码
} // 线程进入终止状态
状态转换图
以下是Java线程状态转换的示意图:
[New] --start()--> [Runnable] --调度--> [Running]
| |
| |--sleep()/wait(timeout)--> [Timed Waiting]
| |
| |--wait()/join()--> [Waiting]
|
|--run()完成或异常--> [Terminated]
示例代码
public class ThreadLifecycleExample {
public static void main(String[] args) {
Thread myThread = new Thread(() -> {
try {
System.out.println("Thread is running.");
Thread.sleep(1000); // 进入计时等待状态
synchronized (ThreadLifecycleExample.class) {
ThreadLifecycleExample.class.wait(); // 进入等待状态
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
myThread.start(); // 进入可运行状态
try {
Thread.sleep(500); // 主线程进入计时等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ThreadLifecycleExample.class) {
ThreadLifecycleExample.class.notify(); // 唤醒等待的线程
}
}
}
总结
- 新建状态(New):线程对象被创建,但尚未启动。
- 可运行状态(Runnable):线程调用
start()
方法后进入可运行状态,等待调度器选择运行。 - 运行状态(Running):线程调度器选择一个可运行状态的线程并让它运行。
- 阻塞状态(Blocked):线程在等待获取锁或进行I/O操作时进入阻塞状态。
- 等待状态(Waiting):线程通过调用
wait()
、join()
等方法进入等待状态,需要其他线程唤醒。 - 计时等待状态(Timed Waiting):线程通过调用带有超时参数的方法进入计时等待状态,在指定时间后自动恢复。
- 终止状态(Terminated):线程的
run()
方法执行完毕或因异常终止,线程进入终止状态。