java线程状态如何看
查看Java线程状态的方法
Java线程的状态可以通过Thread.getState()方法获取,返回值为Thread.State枚举类型。Java线程共有6种状态:
- NEW: 线程已创建但未启动(未调用
start()方法) - RUNNABLE: 线程正在JVM中执行或等待操作系统资源(如CPU)
- BLOCKED: 线程被阻塞,等待获取监视器锁(synchronized)
- WAITING: 线程无限期等待,直到其他线程显式唤醒(如
Object.wait()或Thread.join()) - TIMED_WAITING: 线程有限期等待(如
Thread.sleep()或带超时的Object.wait()) - TERMINATED: 线程已执行完毕
代码示例查看线程状态
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("Before start: " + thread.getState()); // NEW
thread.start();
System.out.println("After start: " + thread.getState()); // RUNNABLE
Thread.sleep(500);
System.out.println("During sleep: " + thread.getState()); // TIMED_WAITING
thread.join();
System.out.println("After finish: " + thread.getState()); // TERMINATED
使用jstack工具查看线程状态
-
通过命令行获取Java进程ID:
jps -l -
使用jstack生成线程转储:
jstack <pid> > thread_dump.txt -
在生成的thread_dump.txt文件中,可以查看所有线程的状态信息,例如:
"main" #1 prio=5 os_prio=0 tid=0x00007f1d9800a800 nid=0x1e03 waiting on condition [0x00007f1da0a8d000] java.lang.Thread.State: TIMED_WAITING (sleeping)
使用VisualVM或JConsole工具
这些图形化工具可以实时监控线程状态:

- 启动VisualVM或JConsole
- 连接到目标Java进程
- 在"Threads"选项卡中查看所有线程及其当前状态
- 支持线程转储和实时状态更新
线程状态转换注意事项
- 从NEW状态只能转换到RUNNABLE状态(通过
start()方法) - RUNNABLE状态可能因为I/O操作或资源竞争看起来像阻塞,但JVM仍认为是RUNNABLE
- BLOCKED状态仅发生在synchronized同步块竞争时
- WAITING和TIMED_WAITING的区别在于是否有明确的等待时间限制






