13

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

  1. 首先通过 Windows
  2. 以编程方式
4

5 回答 5

31

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

如果您想通过 Windows 工具而不是编程方式查看正在运行的线程,您可以使用Process Explorer

于 2012-07-18T08:16:56.963 回答
5

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

于 2012-07-18T08:15:01.410 回答
1

回应您的以下评论

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

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

如果您是分析 Java 程序的新手,JVisualVM 可以让您在运行代码时查看幕后发生的事情。您可以查看堆、GC 活动,检查运行/等待任何样本/配置您的 CPU 或内存使用情况的线程。还有不少插件。

于 2012-07-18T08:32:46.890 回答
0

从 Windows:

肯定有一个进程的性能计数器可以告诉你这一点。

以编程方式:

Thread#activeCount

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

或者更直接地说,ThreadGroup#activeCount

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

ThreadGroup#getParent

返回此线程组的父级。

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

所有这些似乎都暗示了以下几点:

int activeThreadTotalEstimate() {
    ThreadGroup group;
    ThreadGroup parent;

    group = Thread.currentThread().getThreadGroup();
    while ((parent = group.getParent()) != null) {
        group = parent;
    }
    return group.activeCount();
}
于 2012-07-18T08:14:58.423 回答
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

于 2016-08-03T12:15:23.823 回答