获取当前在 Java 中运行的所有线程的列表

2022-08-31 05:30:10

有没有办法获得当前JVM中所有正在运行的线程的列表(包括我的类启动的线程)?

是否也可以获取列表中所有线程的 和 对象?ThreadClass

我希望能够通过代码做到这一点。


答案 1

要获得可迭代集:

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

性能:12 个线程为 0 毫秒(Azul JVM 16.0.1、Windows 10、Ryzen 5600X)。


答案 2

获取根的句柄,如下所示:ThreadGroup

ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
    rootGroup = parentGroup;
}

现在,重复调用根组上的函数。第二个参数允许您以递归方式获取所有线程:enumerate()

Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
    threads = new Thread[threads.length * 2];
}

请注意我们如何反复调用 enumerate(),直到数组足够大以包含所有条目。