目录
JVM线程状态
/      

JVM线程状态

Java 线程状态总结

1. Java 层面的线程状态(Thread.State 枚举)

JDK 定义了 6 种:

  • NEW线程对象刚创建,还没调用 start()
  • RUNNABLE线程正在运行或在就绪队列等待 CPU 时间片。
  • BLOCKED等待获取某个对象的监视器锁(synchronized)。
  • WAITING无限期等待另一个线程的唤醒(Object.wait() 无超时,或 LockSupport.park())。
  • TIMED_WAITING有时限的等待(sleep(timeout)、join(timeout)、wait(timeout)、parkNanos())。
  • TERMINATED
    线程执行完成,结束。

2. JVM 层面的线程状态(jstack 输出)

jstack 输出的线程 dump,会显示更细粒度的状态:

  • RUNNABLE

    • 表示线程处于运行中或等待 CPU 时间片。
    • 对应 Java 的 RUNNABLE。
    • 示例:
      "main" #1 prio=5 os_prio=31 tid=0x... RUNNABLE
      
  • BLOCKED (on object monitor)

    • 等待进入 synchronized 临界区。
    • 对应 Java 的 BLOCKED。
    • 示例:
      - waiting to lock <0x00000000> (a java.lang.Object)
      
  • WAITING (on object monitor)

    • 调用了 Object.wait()(无限等待)。
    • 对应 Java 的 WAITING。
    • 示例:
      - waiting on <0x00000000> (a java.lang.Object)
      
  • TIMED_WAITING (sleeping)

    • 线程在 Thread.sleep(ms)。
  • TIMED_WAITING (parking)

    • 线程在 LockSupport.parkNanos() 或 parkUntil(),常见于并发包。
  • TIMED_WAITING (on object monitor)

    • 调用了 wait(timeout),即带超时的 Object.wait()。
  • NATIVE (JNI calls)

    • 线程正在执行本地方法。
  • TERMINATED

    • 线程已结束,一般不会出现在 jstack。

3. 对照表

Java Thread.Statejstack 可能看到的状态
NEW不会出现在 jstack(没 start() 不会 dump 出来)
RUNNABLERUNNABLE
BLOCKEDBLOCKED (on object monitor)
WAITINGWAITING (on object monitor) / WAITING (parking)
TIMED_WAITINGTIMED_WAITING (sleeping / parking / on object monitor)
TERMINATED一般不显示(线程已消亡)

4. 小结

  • Java 层面只有 6 种状态(Thread.State)。
  • JVM 层面(jstack)会更细分,尤其是 WAITING / TIMED_WAITING,会标明原因。
  • 分析线程 dump 时,重点关注 RUNNABLE、BLOCKED、WAITING、TIMED_WAITING

标题:JVM线程状态
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2025/08/27/1756260155424.html