So ermitteln Sie die Anzahl der Threads in einem Java-Prozess


Antworten:


53

Das nützliche Tool zum Debuggen von Java-Programmen gibt die Anzahl der Threads und andere relevante Informationen dazu an:

jconsole <process-id>



77

ManagementFactory.getThreadMXBean().getThreadCount()beschränkt sich nicht wie Thread.activeCount()hier auf Thread-Gruppen .


+1 Dafür. Die Menge an Thread ist genau die gleiche, die ich sehe top. Obwohl im Debug-Fenster, sehe ich nur 2 Thread anstelle von 5 .: /
Aruman

ManagementFactory? unter welchem ​​paket?
Meher

import java.lang.management.ManagementFactory; docs.oracle.com/javase/8/docs/api/java/lang/management/… Siehe auch getPeakThreadCount()und andere Methoden, bevor Sie anfangen, es selbst zu tun :)
Christophe Roussy

24

Es gibt eine statische Methode für die ThreadKlasse, die die Anzahl der aktiven Threads zurückgibt, die von der JVM gesteuert werden:

Thread.activeCount()

Gibt die Anzahl der aktiven Threads in der Threadgruppe des aktuellen Threads zurück.

Darüber hinaus sollten externe Debugger alle aktiven Threads auflisten (und es Ihnen ermöglichen, eine beliebige Anzahl von Threads auszusetzen), wenn Sie sie in Echtzeit überwachen möchten.


12

Generische Lösung, die keine GUI wie jconsole erfordert (funktioniert nicht auf Remote-Terminals), ps funktioniert für Nicht-Java-Prozesse, erfordert keine installierte JVM.

ps -o nlwp <pid>


9

Ich habe ein Programm Iterierte alle geschrieben Threadserstellt und Drucken getState()von jedemThread

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();
        }
    }
}

Ausgabe:

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

Wenn Sie unter Bedingung entfernen

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

Sie erhalten auch unter Threads in der Ausgabe, die vom System gestartet wurden.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer.


5

Verwenden des Linux- TopBefehls

top -H -p (process id)

Mit dieser Methode können Sie die Prozess-ID eines Programms abrufen:

ps aux | grep (your program name)

zum Beispiel :

ps aux | grep user.py


1
    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]);
          }
       }
   }

0

Holen Sie sich die Anzahl der Threads mit jstack

jstack <PID> | grep length | cut -d'=' -f 3 | cut -d',' -f 1

Das Ergebnis des obigen Codes unterscheidet sich erheblich von top -H -p <PID>oder ps -o nlwp <PID>weil jstack nur Threads erhält, die von der Anwendung erstellt wurden.

Mit anderen Worten, jstack erhält keine GC-Threads

PS: Verwendung von cutist, woher ich weiß, es zu tun. Hat wahrscheinlich eine einfache und elegante Möglichkeit, diese Zahl aus der jstack-Ausgabe zu extrahieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.