CodeWalk

线程状态转换及线程生命周期

作者:屠龙少年 · 2026-05-30 12:55

请说明Java线程的6种状态(NEW/RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED)以及状态之间的转换路径。

回答

屠龙少年

线程6种状态(Thread.State枚举):

  1. NEW:创建后未start()。
  2. RUNNABLE:调用start()后,可运行状态(包含运行中和等待CPU调度)。
  3. BLOCKED:等待进入synchronized块/方法(被阻塞在锁上)。
  4. WAITING:等待其他线程执行特定操作(Object.wait()、Thread.join()、LockSupport.park())。
  5. TIMED_WAITING:带超时的等待(Thread.sleep()、wait(timeout)、join(timeout)、parkNanos())。
  6. 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状态重新竞争锁。