Java线程6种状态的详细说明、状态转换关系(UML展示)
以下是Java线程状态的详细说明、状态转换关系的UML图描述以及表格整理:
一、Java线程状态
Java线程的生命周期包含以下6种状态:
- NEW:线程已创建但未启动(未调用
start()
方法)。 - RUNNABLE:线程可运行(可能正在执行或等待CPU调度)。
- BLOCKED:线程因等待获取锁(如
synchronized
)而阻塞。 - WAITING:线程主动进入无限期等待(需其他线程显式唤醒)。
- TIMED_WAITING:线程进入有限期等待(自动超时后恢复)。
- TERMINATED:线程执行完毕或异常终止。
二、状态转换关系(UML图描述)
以下是线程状态转换的UML状态图结构(用文字描述):
+-------------------+
| NEW |
| |
+-------+-----------+
| start() |
v |
+-------v-----------+
| RUNNABLE | ← [锁释放]
| | ← [超时/中断]
+-------+-----------+ ← [唤醒]
| |
| +→ [竞争锁失败] → +----------------+
| → | BLOCKED |
| → +----------------+
| ← [锁释放]
| +→ [调用wait()等] → +----------------+
| → | WAITING |
| → +----------------+
| ← [notify()/interrupt()]
| +→ [调用sleep()等] → +----------------+
| → | TIMED_WAITING |
| → +----------------+
| ← [超时/中断/唤醒]
| |
| +→ [run()执行完毕] → +----------------+
+--------------------------→ | TERMINATED |
+----------------+
转换条件说明:
- NEW → RUNNABLE:调用
thread.start()
。 - RUNNABLE → BLOCKED:尝试获取被占用的
synchronized
锁。 - RUNNABLE → WAITING:调用
Object.wait()
、Thread.join()
或LockSupport.park()
。 - RUNNABLE → TIMED_WAITING:调用
Thread.sleep()
、Thread.join(long)
或Object.wait(long)
。 - RUNNABLE → TERMINATED:
run()
方法执行完毕或抛出未捕获异常。 - BLOCKED → RUNNABLE:锁被释放。
- WAITING → RUNNABLE:被
notify()
、unpark()
或interrupt()
唤醒。 - TIMED_WAITING → RUNNABLE:超时、被
notify()
、unpark()
或interrupt()
唤醒。 - TERMINATED:终态,无法转换。
三、状态对比表格
状态 | 描述 | 转换条件 | 典型场景 |
---|---|---|---|
NEW | 线程已创建但未启动。 | start() → RUNNABLE。 | 线程对象初始化后未启动。 |
RUNNABLE | 线程可运行(可能正在执行或等待CPU调度)。 | - 锁竞争失败 → BLOCKED - 调用 wait() → WAITING- 调用 sleep() → TIMED_WAITING- run() 执行完毕 → TERMINATED | 线程正常执行业务逻辑。 |
BLOCKED | 线程因等待锁而阻塞。 | 锁被释放 → RUNNABLE。 | 竞争synchronized 锁时。 |
WAITING | 线程主动进入无限期等待(需其他线程显式唤醒)。 | 被notify() 、unpark() 或interrupt() → RUNNABLE。 | 调用wait() 、join() 、LockSupport.park() 。 |
TIMED_WAITING | 线程进入有限期等待(超时或被中断后恢复)。 | 超时/被notify() 、unpark() 或interrupt() → RUNNABLE。 | 调用sleep() 、wait(long) 、join(long) 。 |
TERMINATED | 线程执行完毕或异常终止。 | 终态,无法转换。 | run() 方法执行结束或抛出未捕获异常。 |
四、关键注意事项
- 状态查询:通过
Thread.getState()
获取当前线程状态。 - 状态转换的触发条件:
BLOCKED
:仅因锁竞争失败导致,需释放锁后恢复。WAITING/TIMED_WAITING
:需外部干预(如notify()
、interrupt()
)或超时才能恢复。
- 中断的影响:
interrupt()
可能使线程从WAITING
或TIMED_WAITING
状态恢复(取决于具体方法实现)。 RUNNABLE
状态的特殊性:包含两种子状态:- 可运行:等待CPU调度。
- 正在运行:当前正在执行。
通过以上状态管理和转换逻辑,可以更清晰地控制线程行为并避免死锁或资源竞争问题。