线程状态转换及线程生命周期
请说明Java线程的6种状态(NEW/RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED)以及状态之间的转换路径。
回答
屠龙少年
线程6种状态(Thread.State枚举):
- NEW:创建后未start()。
- RUNNABLE:调用start()后,可运行状态(包含运行中和等待CPU调度)。
- BLOCKED:等待进入synchronized块/方法(被阻塞在锁上)。
- WAITING:等待其他线程执行特定操作(Object.wait()、Thread.join()、LockSupport.park())。
- TIMED_WAITING:带超时的等待(Thread.sleep()、wait(timeout)、join(timeout)、parkNanos())。
- TERMINATED:run()方法执行完毕。
状态转换路径:
- NEW → (start()) → RUNNABLE
- RUNNABLE → (获取synchronized锁失败) → BLOCKED → (获取到锁) → RUNNABLE
- RUNNABLE → (wait/park/join) → WAITING → (notify/unpark/join线程结束) → BLOCKED或RUNNABLE
- RUNNABLE → (sleep/wait(timeout)/join(timeout)) → TIMED_WAITING → (超时/notify/unpark) → RUNNABLE
- RUNNABLE → (run()完成) → TERMINATED
注意:从WAITING/TIMED_WAITING被唤醒后,如果等待的是synchronized锁对象,先进入BLOCKED状态重新竞争锁。