Wie kann ich die Anzahl der Threads in einem Java-Prozess sehen?
Antworten:
java.lang.Thread.activeCount()
Es wird die Anzahl der aktiven Threads in der Threadgruppe des aktuellen Threads zurückgegeben .
Dokumente: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#activeCount ()
ManagementFactory.getThreadMXBean().getThreadCount()beschränkt sich nicht wie Thread.activeCount()hier auf Thread-Gruppen .
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 auch getPeakThreadCount()und andere Methoden, bevor Sie anfangen, es selbst zu tun :)
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.
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>
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.
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
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]);
}
}
}
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.