是否有任何方法可以获得当前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(),直到数组大到足以包含所有条目。

其他回答

您查看过jconsole吗?

这将列出为特定Java进程运行的所有线程。

可以从JDK bin文件夹启动jconsole。

你也可以通过在Windows中按Ctrl+Break或在Linux中发送kill pid——QUIT来获得所有线程的完整堆栈跟踪。

是的,看一下如何获取线程列表。那页上有很多例子。

这是通过编程来实现的。如果你只是想在Linux上得到一个列表,至少你可以使用这个命令:

kill -3 processid

虚拟机将做一个线程转储到标准输出。

在Groovy中,你可以调用私有方法

// Get a snapshot of the list of all threads 
Thread[] threads = Thread.getThreads()

在Java中,只要安全管理器允许,就可以使用反射调用该方法。

您可以从ThreadMXBean获得大量关于线程的信息。

调用静态的ManagementFactory.getThreadMXBean()方法来获得对MBean的引用。

在java控制台中,点击Ctrl-Break。它将列出所有线程以及堆的一些信息。当然,这不会让您访问对象。但无论如何,它对调试都很有帮助。