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

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

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

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

要获得一个可迭代集合:

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

将其转换为数组:

 Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]); 

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

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

现在,重复调用根组上的枚举()函数。 第二个参数可以让你recursion地获得所有的线程:

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

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

是的,看看获得一个线程列表 。 大量的例子在该页面上。

这是以编程方式。 如果你只是想在Linux上的列表,至less你可以使用这个命令:

 kill -3 processid 

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

你可以从ThreadMXBean得到很多关于线程的信息。

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

你看看jconsole吗?

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

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

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

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

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

Java中 ,只要安全pipe理器允许,就可以使用reflection来调用该方法。

在java控制台中, 按Ctrl-Break 。 它将列出所有线程以及关于堆的一些信息。 这当然不会给你访问的对象。 但无论如何,它对debugging都是非常有帮助的。

  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 + " "); } } 

你可以尝试这样的事情:

  Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive())); 

如果你需要,你显然可以获得更多的线程特征。

代码片段获取主线程启动的线程列表:

 import java.util.Set; public class ThreadSet { public static void main(String args[]) throws Exception{ Thread.currentThread().setName("ThreadSet"); for ( int i=0; i< 3; i++){ Thread t = new Thread(new MyThread()); t.setName("MyThread:"+i); t.start(); } Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); for ( Thread t : threadSet){ if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){ System.out.println("Thread :"+t+":"+"state:"+t.getState()); } } } } class MyThread implements Runnable{ public void run(){ try{ Thread.sleep(5000); }catch(Exception err){ err.printStackTrace(); } } } 

输出:

 Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING Thread :Thread[ThreadSet,5,main]:state:RUNNABLE 

如果您需要包括系统线程在内的所有线程(尚未由您的程序启动),请删除以下条件。

 if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()) 

现在输出:

 Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING Thread :Thread[Reference Handler,10,system]:state:WAITING Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING Thread :Thread[ThreadSet,5,main]:state:RUNNABLE Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING Thread :Thread[Finalizer,8,system]:state:WAITING Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE Thread :Thread[Attach Listener,5,system]:state:RUNNABLE 

ManagementFactory.getThreadMXBean()。getAllThreadIds()