获取所有正在运行的JVM线程

2025/04/26

1. 概述

在这个简短的教程中,我们将学习如何获取当前JVM中所有正在运行的线程,包括未由我们的类启动的线程。

2. 使用Thread类

Thread类的getAllStackTrace()方法返回所有正在运行的线程的堆栈跟踪,它返回一个Map,其键是Thread对象,因此我们可以获取该键集,并简单地循环遍历其元素以获取有关线程的信息。

让我们使用printf()方法使输出更具可读性:

Set<Thread> threads = Thread.getAllStackTraces().keySet();
System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : threads) {
    System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}

输出将如下所示:

Name            	 State           	 Priority        	 isDaemon
main            	 RUNNABLE        	 5               	 false
Signal Dispatcher 	 RUNNABLE        	 9               	 true
Finalizer       	 WAITING         	 8               	 true
Reference Handler 	 WAITING         	 10              	 true

我们看到,除了运行主程序的main线程之外,还有另外3个线程,不同Java版本的结果可能会有所不同。

让我们进一步了解一下这些其他线程:

  • Signal Dispatcher:此线程处理操作系统发送给JVM的信号。
  • Finalizer:此线程对不再需要释放系统资源的对象执行终结处理。
  • Reference Handler:此线程将不再需要的对象放入队列中,以便由Finalizer线程处理。

如果主程序退出,所有这些线程都将终止。

3. 使用Apache Commons中的ThreadUtils类

我们还可以使用Apache Commons Lang库中的ThreadUtils类来实现相同的目标:

让我们向pom.xml文件添加一个依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

只需使用getAllThreads()方法即可获取所有正在运行的线程:

System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : ThreadUtils.getAllThreads()) {
    System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}

输出与上面相同。

4. 总结

综上所述,我们学习了两种获取当前JVM中所有正在运行的线程的方法。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章