web-dev-qa-db-fra.com

Comment obtenir le nombre de threads dans un processus Java

Comment puis-je voir le nombre de threads dans un processus Java?

66
ndemir

Outil utile pour déboguer Java, il donne le nombre de threads et d'autres informations pertinentes à leur sujet:

jconsole <process-id>

50
laura
Java.lang.Thread.activeCount()

Il renverra le nombre de threads actifs dans le groupe de threads du thread actuel .

docs: http://docs.Oracle.com/javase/7/docs/api/Java/lang/Thread.html#activeCount ()

81
miku

ManagementFactory.getThreadMXBean().getThreadCount() ne se limite pas aux groupes de threads comme Thread.activeCount() le fait.

67
gustafc

Il existe une méthode statique sur la classe Thread qui retournera le nombre de threads actifs contrôlés par la JVM:

Thread.activeCount()

Renvoie le nombre de threads actifs dans le groupe de threads du thread actuel.

De plus, les débogueurs externes doivent répertorier tous les threads actifs (et vous permettre de suspendre n'importe quel nombre d'entre eux) si vous souhaitez les surveiller en temps réel.

22
MarkPowell

Solution générique qui ne nécessite pas d'interface graphique comme jconsole (ne fonctionne pas sur les terminaux distants), ps fonctionne pour les processus non Java, ne nécessite pas de JVM installée.

ps -o nlwp <pid>

8
Felipe Oliveira

J'ai écrit un programme pour répéter tout Threads créé et imprimer getState() de chaque Thread

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:

Java ThreadStatus

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

Si vous supprimez la condition ci-dessous

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())

Vous obtiendrez également ci-dessous les threads en sortie, qui ont été démarrés par le système.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer.

7
Ravindra babu

Utilisation de la commande Linux Top

top -H -p (process id)

vous pouvez obtenir l'ID de processus d'un programme par cette méthode:

ps aux | grep (your program name)

par exemple :

ps aux | grep user.py

5
    public class MainClass {

        public static void main(String args[]) {

          Thread t = Thread.currentThread();
          t.setName("My Thread");

          t.setPriority(1);

          System.out.println("current thread: " + t);

          int active = Thread.activeCount();
          System.out.println("currently active threads: " + active);
          Thread all[] = new Thread[active];
          Thread.enumerate(all);

          for (int i = 0; i < active; i++) {
             System.out.println(i + ": " + all[i]);
          }
       }
   }
2
Upul Bandara