Kry*_*ten 221 java multithreading jvm
有没有什么办法可以获得当前JVM中所有正在运行的Thread的列表(包括我的类未启动的Threads)?
是否也可以在列表中获取所有Thread的Thread和Class对象?
我希望能够通过代码完成此操作.
the*_*lfe 299
要获得可迭代集:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Run Code Online (Sandbox Code Playgroud)
Fre*_*abe 71
获取root的句柄ThreadGroup
,如下所示:
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}
Run Code Online (Sandbox Code Playgroud)
现在,enumerate()
重复调用根组上的函数.第二个参数允许您以递归方式获取所有线程:
Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
threads = new Thread[threads.length * 2];
}
Run Code Online (Sandbox Code Playgroud)
注意我们如何反复调用enumerate(),直到数组足够大以包含所有条目.
cle*_*tus 28
是的,看一下获取线程列表.该页面上有很多例子.
这是以编程方式进行的.如果你只想在Linux上找到一个列表,至少可以使用这个命令:
kill -3 processid
Run Code Online (Sandbox Code Playgroud)
并且VM将对stdout执行线程转储.
pjp*_*pjp 14
你看过jconsole吗?
这将列出为特定Java进程运行的所有线程.
您可以从JDK bin文件夹启动jconsole.
您还可以通过Ctrl+Break
在Windows中或kill pid --QUIT
在Linux中发送来获取所有线程的完整堆栈跟踪.
Apache Commons用户可以使用ThreadUtils
。当前的实现使用前面概述的遍历线程组方法。
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.println(t.getName() + ", " + t.isDaemon());
}
Run Code Online (Sandbox Code Playgroud)
在Groovy中,您可以调用私有方法
// Get a snapshot of the list of all threads
Thread[] threads = Thread.getThreads()
Run Code Online (Sandbox Code Playgroud)
在Java中,您可以使用安全管理器允许的反射来调用该方法.
小智 5
您可以尝试如下操作:
Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive()));
Run Code Online (Sandbox Code Playgroud)
并且显然可以根据需要获得更多线程特征。
获取主线程启动的线程列表的代码片段:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
如果您需要包括系统线程在内的所有线程,但这些线程尚未由您的程序启动,请删除以下条件。
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())
Run Code Online (Sandbox Code Playgroud)
现在输出:
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
Run Code Online (Sandbox Code Playgroud)
要使用终端获取线程列表及其完整状态,您可以使用以下命令:
jstack -l <PID>
Run Code Online (Sandbox Code Playgroud)
这<PID>
是在您的计算机上运行的进程的 ID。要获取 Java 进程的进程 ID,您只需运行该jps
命令即可。
此外,您可以在 TDA(线程转储分析器)中分析由 jstack 生成的线程转储,例如fastthread或spotify 线程分析器工具。
归档时间: |
|
查看次数: |
192121 次 |
最近记录: |