如何检查Java中当前运行的线程数?

我正在寻找一种方法来查看当前运行的线程数

  1. 首先通过Windows
  2. 编程

这将为您提供VM中的线程总数:

int nbThreads = Thread.getAllStackTraces().keySet().size(); 

现在,如果您想要当前正在执行的所有线程,您可以这样做:

 int nbRunning = 0; for (Thread t : Thread.getAllStackTraces().keySet()) { if (t.getState()==Thread.State.RUNNABLE) nbRunning++; } 

这里列举了可能的状态: Thread.State javadoc

如果您希望看到运行的线程不是programmaticaly而是使用Windows工具,则可以使用Process Explorer 。

您可以获取在JVM中运行的所有线程及其堆栈跟踪使用Thread.getAllStackTraces()

回应您的以下评论

在下面的代码中:while(resultSet.next()){name = resultSet.getString(“hName”); MyRunnable worker = new MyRunnable(hName); threadExecutor.execute(worker); }。 我的线程池大小为10.我需要确保我的程序正常运行multithreading并想要检查在某个时刻运行了多少线程。 我怎样才能做到这一点?

另一个答案,我建议您使用JVisualVM配置代码,并检查您的线程池是否正常工作。 这个建议背后的原因是你不必为JVM管理的所有其他内务线程而烦恼。 除了你想要做的是为什么像JVisualVM这样的工具。

如果您不熟悉Java程序的分析,JVisualVM可以让您在运行代码时看到底层的内容。 您可以看到堆,GC活动,检查运行/等待任何样本/配置文件的线程您的CPU或内存使用情况。 还有很多插件。

从Windows:

对于可以告诉您的过程,必然会有一个性能计数器 。

编程方式:

Thread#activeCount

返回当前线程的线程组及其子组中活动线程数的估计值。 递归迭代当前线程的线程组中的所有子组。

或者更直接的, ThreadGroup#activeCount

返回此线程组及其子组中活动线程数的估计值。

ThreadGroup#getParent

返回此线程组的父级。

首先,如果父级不为null,则调用父线程组的checkAccess方法,不带参数; 这可能会导致安全exception。

所有这些似乎都表明了以下几点:

 int activeThreadTotalEstimate() { ThreadGroup group; ThreadGroup parent; group = Thread.currentThread().getThreadGroup(); while ((parent = group.getParent()) != null) { group = parent; } return group.activeCount(); } 

代码段:

 import java.util.Set; import java.lang.Thread.State; public class ActiveThreads { public static void main(String args[]) throws Exception{ for ( int i=0; i< 5; i++){ Thread t = new Thread(new MyThread()); t.setName("MyThread:"+i); t.start(); } int threadCount = 0; Set threadSet = Thread.getAllStackTraces().keySet(); for ( Thread t : threadSet){ if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup() && t.getState() == Thread.State.RUNNABLE){ System.out.println("Thread :"+t+":"+"state:"+t.getState()); ++threadCount; } } System.out.println("Thread count started by Main thread:"+threadCount); } } class MyThread implements Runnable{ public void run(){ try{ Thread.sleep(2000); }catch(Exception err){ err.printStackTrace(); } } } 

输出:

 Thread :Thread[main,5,main]:state:RUNNABLE Thread count started by Main thread:1 

说明:

Thread.getAllStackTraces().keySet()提供了所有线程的列表,这些线程已由Program and System启动。 如果没有ThreadeGroup条件,如果它们处于活动状态,您将获得系统线程计数。

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer