2012-07-18 86 views
11

我正在寻找一种方式来查看当前正在运行的线程如何检查Java中当前正在运行的线程的数量?

  1. 通过Windows首先
  2. 编程
+2

你的意思是编程? – Keppil 2012-07-18 08:13:11

+0

我是新来处理多线程。我有一个Java程序,它使用大小为10的线程池。程序运行时,如何检查程序当前运行的线程数量?我需要一种方法来通过Windows来执行此操作,并通过程序本身打印出当前正在运行的线程数。 – 2012-07-18 08:19:36

回答

26

这会给你的虚拟机中的线程总数:

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

0

在Windows数:

有必然是一个performance counter为可以告诉你的过程。

编程:

Thread#activeCount

返回当前线程的线程组及其子组在活动线程数的估计。递归地遍历当前线程的线程组中的所有子组。

或者更直接,ThreadGroup#activeCount

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

ThreadGroup#getParent

返回该线程组的双亲。首先,如果父项不为null,则父线程组的checkAccess方法将不带参数地调用;如果父项不为空,则不调用父线程组的checkAccess方法;否则,调用父线程组的checkAccess方法。这可能会导致安全异常。

所有这一切似乎表明沿着线的东西:

int activeThreadTotalEstimate() { 
    ThreadGroup group; 
    ThreadGroup parent; 

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

在回答您以下注释

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

到另一个答案,我建议你用JVisualVM分析你的代码,并检查你的线程池是否正常工作。这个建议背后的原因是,那么你不必担心JVM管理的所有其他管家线程。除了你想要做的是为什么像JVisualVM这样的工具。

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

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

相关问题