是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?

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

我希望能够通过代码来实现。


当前回答

要使用终端获取线程列表及其完整状态,您可以使用下面的命令:

jstack -l <PID>

>是在您的计算机上运行的进程的id。要获得java进程的进程id,可以简单地运行jps命令。

此外,您还可以在TDAs(线程转储分析器)(fastthread或spotify线程分析工具)中分析jstack生成的线程转储。

其他回答

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

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

kill -3 processid

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

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

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

要使用终端获取线程列表及其完整状态,您可以使用下面的命令:

jstack -l <PID>

>是在您的计算机上运行的进程的id。要获得java进程的进程id,可以简单地运行jps命令。

此外,您还可以在TDAs(线程转储分析器)(fastthread或spotify线程分析工具)中分析jstack生成的线程转储。

获取一个可迭代集:

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

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

您查看过jconsole吗?

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

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

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