Java Language Obtenir l'état de tous les threads démarrés par votre programme, à l'exception des threads système


Exemple

Extrait de code:

import java.util.Set;

public class ThreadStatus {
    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()) {
                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();
        }
    }
}

Sortie:

Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:3,5,main]:state:TIMED_WAITING
Thread :Thread[main,5,main]:state:RUNNABLE
Thread :Thread[MyThread:4,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread count started by Main thread:6

Explication:

Thread.getAllStackTraces().keySet() renvoie tous les Thread y compris les threads d'application et les threads système. Si vous êtes uniquement intéressé par le statut des threads, démarré par votre application, effectuez une itération du jeu de Thread en vérifiant le groupe de threads d'un thread particulier par rapport au thread de votre programme principal.

En l'absence de la condition ThreadGroup ci-dessus, le programme renvoie le statut des threads système ci-dessous:

Reference Handler
Signal Dispatcher
Attach Listener
Finalizer