一、前言
在上一篇文章中,我们学习了 Java 中创建线程的 5 种方式,掌握了线程的基础创建与启动逻辑。但线程从创建到销毁并非一成不变,而是会在不同状态之间转换。理解线程的生命周期和状态转换,是解决多线程并发问题的关键。
本文将从理论到实践,深入解析 Java 线程的 6 种状态,演示状态转换的核心路径,并通过工具分析线程状态,帮助大家彻底掌握这一核心知识点。
二、Java 线程的 6 种状态
Java 线程的状态被明确枚举在 Thread.State 中,共包含 6 种状态,任何时刻一个线程只能处于其中一种状态。
| 状态名称 | 核心含义 | 进入条件 | 退出条件 |
|---|---|---|---|
| NEW(新建) | 线程对象已创建,但未调用 start() 方法 | 创建 Thread 实例后,未执行 start() | 调用 start() 方法 |
| RUNNABLE(可运行) | 线程正在 CPU 上执行,或处于就绪状态等待 CPU 调度 | 调用 start() 方法;从其他阻塞 / 等待状态唤醒 | 线程执行完毕;进入阻塞 / 等待状态 |
| BLOCKED(阻塞) | 线程因竞争锁失败而被阻塞 | 线程尝试进入 synchronized 代码块 / 方法,但锁被其他线程持有 | 成功获取到锁 |
| WAITING(等待) | 线程无时间限制等待,需其他线程主动唤醒 | 调用 Object.wait()(无参)、Thread.join()(无参)、LockSupport.park() | 其他线程调用 Object.notify()/notifyAll()、被 join 的线程执行完毕、调用 LockSupport.unpark() |
| TIMED_WAITING(超时等待) | 线程有时间限制等待,超时后自动唤醒 | 调用 Thread.sleep(long)、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()/parkUntil() | 超时自动唤醒;其他线程提前唤醒 |
| TERMINATED(终止) | 线程执行完毕或异常退出 | run() 方法执行完成;线程执行过程中抛出未捕获异常 | 无(线程生命周期结束) |
三、线程状态转换流程图

四、线程状态转换
线程状态转换有固定的核心路径,我们通过代码案例逐一演示关键转换场景,直观观察状态变化。
前置说明
- 所有案例中,使用 Thread.getState() 方法获取线程当前状态。
- 为了精准观察状态,使用 Thread.sleep() 控制线程执行节奏,避免因 CPU 调度过快导致状态无法捕捉。
场景 1:NEW → RUNNABLE → TERMINATED(基础路径)
**核心逻辑:**线程创建后处于 NEW 状态,调用 start() 进入 RUNNABLE,执行完 run() 后进入 TERMINATED。
public class {
InterruptedException {
(() -> {
System.out.println( + Thread.currentThread().getState());
{
Thread.sleep();
} (InterruptedException e) {
e.printStackTrace();
}
}, );
System.out.println( + thread.getState());
thread.start();
Thread.sleep();
System.out.println( + thread.getState());
thread.join();
System.out.println( + thread.getState());
}
}

