是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
当前回答
获取根线程组的句柄,像这样:
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(),直到数组大到足以包含所有条目。
其他回答
Apache Commons用户可以使用ThreadUtils。当前实现使用前面概述的线程组方法。
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.println(t.getName() + ", " + t.isDaemon());
}
您查看过jconsole吗?
这将列出为特定Java进程运行的所有线程。
可以从JDK bin文件夹启动jconsole。
你也可以通过在Windows中按Ctrl+Break或在Linux中发送kill pid——QUIT来获得所有线程的完整堆栈跟踪。
您可以使用返回所有活动线程id的getAllThreadIds。当此方法返回时,返回数组中包含的某些线程可能已经终止。
ManagementFactory.getThreadMXBean().getAllThreadIds()
获取一个可迭代集:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
性能:0毫秒,12个线程(Azul JVM 16.0.1, Windows 10, Ryzen 5600X)。
获取根线程组的句柄,像这样:
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(),直到数组大到足以包含所有条目。