threadmxbean.getallthreadids()返回当前jvm中所有活动线程(已启动未终止)的id数组,包括runnable、blocked、waiting、timed_waiting及new状态线程,但不含terminated或未start()的线程,也包含jvm系统线程。

ThreadMXBean.getAllThreadIds() 返回的是当前 JVM 中所有**活动线程**(live threads)的 ID 数组,不是“所有变量线程 ID”——Java 中没有“变量线程”这个概念,可能是对术语的误解。
它获取的是哪些线程?
该方法返回的线程 ID 包含:
- 所有已启动、尚未终止的线程(包括 RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、NEW 状态中仍存活的线程)
- 但不包括已终止(TERMINATED)或还未 start() 的线程
- 包含 JVM 自身创建的系统线程(如 Finalizer、Reference Handler、Common-ForkJoin-Pool 线程等)
常见误用与注意事项
使用时需注意:
- 返回的 ID 是
long类型,唯一标识一个线程(在该线程生命周期内不变),但**ID 可能复用**(线程退出后,新线程可能获得相同 ID) - 不能通过该 ID 直接获取线程对象;需配合
ThreadMXBean.getThreadInfo(long id)或ThreadMXBean.getThreads(long[] ids)获取快照信息 - 该方法本身不加锁,但返回的线程列表是某一时刻的快照,可能瞬间过期(线程可能在调用后立即退出)
- 需要
ManagementFactory.getThreadMXBean()获取实例,且默认开启线程监控(大多数 JDK 默认开启,但某些安全策略下可能受限)
典型使用示例
想打印所有活动线程名称和状态:
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] threadIds = bean.getAllThreadIds();
ThreadInfo[] infos = bean.getThreadInfo(threadIds, true, true); // 获取堆栈 + 锁信息
for (ThreadInfo info : infos) {
if (info != null) {
System.out.printf("ID: %d, Name: %s, State: %s%n",
info.getThreadId(), info.getThreadName(), info.getThreadState());
}
}










