如何列出 JVM 中的所有虚拟线程?
ThreadMXBean.dumpAllThreads()
、ThreadMXBean.getAllThreadIds()
、ThreadGroup.enumerate()
和Thread.getAllStackTraces()
不返回虚拟线程。
ThreadContainers 类中 JVM 的根线程容器默认维护所有虚拟线程的列表(可以使用 jdk.trackAllThreads 系统属性禁用此行为,我认为在 java 21 之前默认为 false)。 不幸的是,ThreadContainers 类以及 ThreadContainer 类都属于 jdk.internal 模块,因此无法访问。 使用这些的所有其他类也是 jdk.internal 模块的一部分,或者不允许我们访问此线程列表。
另外,ThreadContainers类维护了所有执行器实例的列表,包括那些创建虚拟线程的实例,这些实例内部有一个其所有虚拟线程的列表,但是这个执行器列表也是不可访问的。
甚至 ThreadDumper 类(现在可以创建包括虚拟线程在内的线程转储)也位于 jdk.internal 模块内。
ThreadGroup 的文档以及您提到的其他类和方法声明它们不返回虚拟线程。