thread.getstate() 返回线程当前jvm运行时状态,共new、runnable、blocked、waiting、timed_waiting、terminated六种,与创建方式无关,仅反映生命周期阶段;new和terminated不可逆,getstate()仅用于诊断,不可用于同步控制。

Thread.getState() 返回的是线程当前的 运行时状态,与线程“如何被创建”无关,只取决于它**此刻在JVM中的实际执行阶段**。也就是说,无论你用继承 Thread 类、实现 Runnable、还是使用 Lambda 创建线程,只要线程对象已实例化但尚未 start(),它的状态就是 NEW;一旦调用了 start(),后续状态就由 JVM 调度器动态决定。
线程状态不取决于创建方式,而取决于生命周期阶段
Java 线程有六种状态(定义在 Thread.State 枚举中):
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
这些状态反映的是线程在 JVM 内部的调度状态,不是代码写法导致的差异。例如:
- 用
new Thread(() -> {...})或new MyThread()创建后,未调用start()→ 状态为NEW - 调用
start()后,线程进入就绪或运行 → 状态为RUNNABLE(注意:包括正在运行和等待 CPU 的情况) - 线程在 synchronized 块中等待锁 →
BLOCKED - 调用
Object.wait()、Thread.join()、LockSupport.park()→ 进入WAITING或TIMED_WAITING - 线程 run() 方法执行完毕或抛出未捕获异常 →
TERMINATED
常见误区:Runnable 和 Thread 子类的状态表现完全一致
有人误以为“实现 Runnable 的线程状态更‘轻量’”,其实不然。Thread 对象的状态由 JVM 统一管理,与 target Runnable 是匿名类、Lambda 还是独立类毫无关系。例如:
-
Thread t1 = new Thread(() -> { try { Thread.sleep(100); } catch (IE e) {} });执行t1.getState()在 sleep 中返回TIMED_WAITING -
Thread t2 = new Thread(new Runnable() { public void run() { ... } });同样 sleep 时也返回TIMED_WAITING - 两者在相同执行点调用
getState(),结果必然一致
注意:NEW 和 TERMINATED 是唯一不可逆的状态
一旦线程处于 NEW,只有调用 start() 才能进入 RUNNABLE;一旦变成 TERMINATED,就永远不会再变回其他状态 —— 即使你再次对同一个 Thread 实例调用 start(),也会抛出 IllegalThreadStateException。这点和创建方式无关,是 JVM 规范强制约束的。
调试建议:用 getState() 辅助排查,但别依赖它做逻辑分支
getState() 是诊断工具,不是同步机制:
- 可用于日志记录、监控面板展示线程健康状况
- 不适合用于 while 循环轮询等待某个状态(比如 while(t.getState() != TERMINATED)),因为状态可能瞬间变化且不保证可见性
- 需要等待线程结束,请用
t.join();需要协调执行,请用CountDownLatch、Phaser等显式同步工具
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











