是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
当前回答
您查看过jconsole吗?
这将列出为特定Java进程运行的所有线程。
可以从JDK bin文件夹启动jconsole。
你也可以通过在Windows中按Ctrl+Break或在Linux中发送kill pid——QUIT来获得所有线程的完整堆栈跟踪。
其他回答
获取根线程组的句柄,像这样:
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(),直到数组大到足以包含所有条目。
你可以尝试这样做:
Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive()));
如果你需要,你可以得到更多的线程特性。
是的,看一下如何获取线程列表。那页上有很多例子。
这是通过编程来实现的。如果你只是想在Linux上得到一个列表,至少你可以使用这个命令:
kill -3 processid
虚拟机将做一个线程转储到标准输出。
在java控制台中,点击Ctrl-Break。它将列出所有线程以及堆的一些信息。当然,这不会让您访问对象。但无论如何,它对调试都很有帮助。
public static void main(String[] args) {
// Walk up all the way to the root thread group
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parent;
while ((parent = rootGroup.getParent()) != null) {
rootGroup = parent;
}
listThreads(rootGroup, "");
}
// List all threads and recursively list all subgroup
public static void listThreads(ThreadGroup group, String indent) {
System.out.println(indent + "Group[" + group.getName() +
":" + group.getClass()+"]");
int nt = group.activeCount();
Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
nt = group.enumerate(threads, false);
// List every thread in the group
for (int i=0; i<nt; i++) {
Thread t = threads[i];
System.out.println(indent + " Thread[" + t.getName()
+ ":" + t.getClass() + "]");
}
// Recursively list all subgroups
int ng = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
ng = group.enumerate(groups, false);
for (int i=0; i<ng; i++) {
listThreads(groups[i], indent + " ");
}
}