Как узнать, сколько потоков было создано и запущено?

Это моя простая программа на Java:

public class Counter extends Thread {

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

Я использую 32-разрядную операционную систему Windows. Мой вопрос в том, как мы можем узнать, сколько потоков создано в программе и сколько потоков работает? Есть ли такой инструмент?

Ответы

Ответ 1

System.out.println( "Число активных потоков из данного потока:" + Thread.activeCount());

Ответ 2

Thread.getAllStackTraces() предоставит вам карту, в которой каждый поток является ключевым. Затем вы можете проверить состояние каждого потока и проверить thread.isAlive().

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

Ответ 3

Вы можете получить доступ ко всей доступной информации о потоках в вашей программе, используя: http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

Если вам нужен только инструмент для этого, вы можете использовать jconsole, jvisualvm и другие инструменты профилирования, которые могут показать вам детали выполняемых потоков в gui.

Ответ 4

Я использую этот метод, используя 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;
}

Ответ 5

Вы можете получить набор запущенных потоков из класса 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, будет указан в выводе, вы будете удивлены.

выход:

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