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

时间:2012-07-18 08:10:44

标签: java multithreading

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

  1. 首先通过Windows
  2. 编程

5 个答案:

答案 0 :(得分:27)

这将为您提供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

答案 1 :(得分:5)

您可以使用Thread.getAllStackTraces()

获取在JVM中运行的所有线程及其堆栈跟踪

答案 2 :(得分:1)

回复您的以下评论

  

在下面的代码中:while(resultSet.next()){   名称= resultSet.getString( “hName”); MyRunnable worker = new   MyRunnable(hName); threadExecutor.execute(worker); }。我的主题   池的大小为10.我需要确保我的程序正常运行   正确使用多线程&想检查有多少线程   在某个时刻跑步。我怎么能这样做?

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

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

答案 3 :(得分:0)

来自Windows:

这个过程肯定会有一个performance counter可以告诉你。

编程:

Thread#activeCount

  

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

或更直接地,ThreadGroup#activeCount

  

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

ThreadGroup#getParent

  

返回此线程组的父级。

     

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

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

int activeThreadTotalEstimate() {
    ThreadGroup group;
    ThreadGroup parent;

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

答案 4 :(得分:0)

代码段:

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<Thread> 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