Wie kann ich die Anzahl der Threads in einem Java-Prozess sehen?
java
multithreading
ndemir
quelle
quelle
ManagementFactory.getThreadMXBean().getThreadCount()
beschränkt sich nicht wieThread.activeCount()
hier auf Thread-Gruppen .quelle
top
. Obwohl im Debug-Fenster, sehe ich nur 2 Thread anstelle von 5 .: /import java.lang.management.ManagementFactory;
docs.oracle.com/javase/8/docs/api/java/lang/management/… Siehe auchgetPeakThreadCount()
und andere Methoden, bevor Sie anfangen, es selbst zu tun :)Es gibt eine statische Methode für die
Thread
Klasse, die die Anzahl der aktiven Threads zurückgibt, die von der JVM gesteuert werden:Thread.activeCount()
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.
quelle
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>
quelle
Ich habe ein Programm Iterierte alle geschrieben
Threads
erstellt und DruckengetState()
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
.quelle
Verwenden des Linux-
Top
Befehlstop -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
quelle
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]); } } }
quelle
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>
oderps -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
cut
ist, woher ich weiß, es zu tun. Hat wahrscheinlich eine einfache und elegante Möglichkeit, diese Zahl aus der jstack-Ausgabe zu extrahieren.quelle