在 Java 中,线程的生命周期由 java.lang.Thread
类定义,并通过 线程状态(Thread State) 来描述。线程的生命周期包括以下几个状态:
1. 线程的六大状态
Java 中线程的生命周期可以分为以下六种状态,定义在 Thread.State
枚举类中:
状态 | 描述 |
---|---|
NEW | 线程刚被创建,但尚未启动(未调用 start() 方法)。 |
RUNNABLE | 线程正在 JVM 中执行,可能正在运行,也可能在等待 CPU 时间片。 |
BLOCKED | 线程被阻塞,等待获取监视器锁(例如,进入 synchronized 代码块)。 |
WAITING | 线程处于等待状态,等待其他线程显式唤醒(例如,调用 wait() 方法)。 |
TIMED_WAITING | 线程处于限时等待状态,等待其他线程唤醒或超时(例如,调用 sleep() 或 wait(timeout) )。 |
TERMINATED | 线程已经执行完毕,终止状态。 |
2. 线程状态转换图
以下是线程状态之间的转换关系:
NEW → RUNNABLE → BLOCKED → RUNNABLE → TERMINATED
↓ ↓
WAITING ← TIMED_WAITING
- NEW → RUNNABLE:调用
start()
方法后,线程进入RUNNABLE
状态。 - RUNNABLE → BLOCKED:线程尝试获取锁但失败,进入
BLOCKED
状态。 - RUNNABLE → WAITING:线程调用
wait()
、join()
等方法,进入WAITING
状态。 - RUNNABLE → TIMED_WAITING:线程调用
sleep(timeout)
、wait(timeout)
等方法,进入TIMED_WAITING
状态。 - BLOCKED → RUNNABLE:线程成功获取锁,重新进入
RUNNABLE
状态。 - WAITING/TIMED_WAITING → RUNNABLE:线程被唤醒(例如,
notify()
、notifyAll()
)或超时,重新进入RUNNABLE
状态。 - RUNNABLE → TERMINATED:线程执行完毕,进入
TERMINATED
状态。
3. 代码示例
以下是一个简单的代码示例,展示线程状态的变化:
public class ThreadLifecycleExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000); // TIMED_WAITING
synchronized (ThreadLifecycleExample.class) {
ThreadLifecycleExample.class.wait(); // WAITING
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("State after creation: " + thread.getState()); // NEW
thread.start();
System.out.println("State after start: " + thread.getState()); // RUNNABLE
Thread.sleep(500);
System.out.println("State during sleep: " + thread.getState()); // TIMED_WAITING
Thread.sleep(1000);
System.out.println("State after sleep: " + thread.getState()); // WAITING
synchronized (ThreadLifecycleExample.class) {
ThreadLifecycleExample.class.notify(); // Wake up thread
}
thread.join();
System.out.println("State after termination: " + thread.getState()); // TERMINATED
}
}
4. 总结
- Java 中线程的生命周期由 六大状态 定义:
NEW
、RUNNABLE
、BLOCKED
、WAITING
、TIMED_WAITING
和TERMINATED
。 - 线程状态的转换由线程的行为(如调用
start()
、sleep()
、wait()
等方法)和外部条件(如锁的获取、唤醒操作)决定。 - 理解线程的生命周期对于编写高效、可靠的多线程程序至关重要。
THE END
暂无评论内容