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

Paw*_*wan 18 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dex*_*son 20

System.out.println("给定线程的活动线程数:"+ Thread.activeCount());

  • 请注意,[`activeCount()`](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#activeCount())仅为您提供了线程数*本地线程组*,但JVM中有多个线程组. (3认同)
  • @Bohemian这个"多线程组"的解决方案是什么? (2认同)

And*_*ejs 10

Thread.getAllStackTraces()将为您提供每个线程都是关键的地图.然后,您可以检查每个线程的状态并进行检查thread.isAlive().

Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
Run Code Online (Sandbox Code Playgroud)


Ash*_*Jha 5

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

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


ala*_*inm 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;
}
Run Code Online (Sandbox Code Playgroud)