如何知道已创建并运行了多少个线程?

时间:2012-04-01 09:28:20

标签: java multithreading

这是我在Java中的简单程序:

public class Counter extends Thread {

    public static void main(String args[]) {    
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        t1.start();
        t2.start();
    }
}

我正在使用Windows操作系统32位。我的问题是,我们怎么知道程序中创建了多少线程以及运行了多少线程?有没有这样的工具?

5 个答案:

答案 0 :(得分:18)

System.out.println(“来自给定线程的活动线程数:”+ Thread.activeCount());

答案 1 :(得分:9)

Thread.getAllStackTraces()将为您提供每个Thread都是键的映射。然后,您可以检查每个线程的状态并检查thread.isAlive()

Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();

答案 2 :(得分:5)

您可以使用以下方法访问程序中有关线程的所有可用信息: http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

如果您只是需要一个工具,您可以使用jconsole,jvisualvm以及其他可以显示gui中正在运行的线程的详细信息的分析工具。

答案 3 :(得分:5)

如果你想要线程本身,我使用ThreadMXBean来使用这个方法:

 /**
 * Return an array with all current threads.
 * @return  Thread[] - array of current Threads
 */
Thread[] getAllThreads(){
    final ThreadGroup root = getRootThreadGroup();
    final ThreadMXBean thbean = ManagementFactory.getThreadMXBean();
    int nAlloc = thbean.getThreadCount();
    int n=0;
    Thread[] threads;
    do{
        nAlloc *=2;
        threads = new Thread[nAlloc];
        n=root.enumerate(threads, true);

    }while(n==nAlloc);
    return java.util.Arrays.copyOf(threads, n);
}

/**
 * Get current ThreadGroup.
 * @see getAllThreads()
 * @return
 */
ThreadGroup getRootThreadGroup(){
    ThreadGroup tg = Thread.currentThread().getThreadGroup();
    ThreadGroup ptg;
    while ((ptg=tg.getParent())!=null){
        tg = ptg;
    }
    return tg;
}

答案 4 :(得分:1)

您可以使用Thread方法从getAllStackTraces()类获取一组正在运行的线程。使用getState() API迭代该设置并打印当前状态。

示例代码:

import java.util.Set;

public class ThreadSet {
    public static void main(String args[]){
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for ( Thread t : threadSet){
            System.out.println("Thread :"+t+":"+"state:"+t.getState());
        }
    }

}

如果您只希望调用main的Thread会在输出中列出,那么您会感到惊讶。

<强> 输出:

java ThreadSet

Thread :Thread[Finalizer,8,system]:state:WAITING
Thread :Thread[main,5,main]:state:RUNNABLE
Thread :Thread[Reference Handler,10,system]:state:WAITING
Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
Thread :Thread[Attach Listener,5,system]:state:RUNNABLE