Gibt es eine Möglichkeit, eine Liste aller laufenden Threads in der aktuellen JVM (einschließlich der Threads) abzurufen? nicht von meiner Klasse gestartet wurden)?
Ist es auch möglich das zu bekommen Thread
und Class
Objekte aller Threads in der Liste abzurufen?
Ich möchte dies durch Code tun können.
java
multithreading
jvm
Kryten
quelle
quelle
Holen Sie sich einen Griff zur Wurzel
ThreadGroup
, wie folgt:Rufen Sie nun die
enumerate()
Funktion für die Stammgruppe wiederholt auf. Mit dem zweiten Argument können Sie alle Threads rekursiv abrufen:Beachten Sie, wie wir enumerate () wiederholt aufrufen, bis das Array groß genug ist, um alle Einträge zu enthalten.
quelle
rootGroup
solltennew Thread[rootGroup.activeCount()+1]
.activeCount()
könnte Null sein, und wenn ja, werden Sie in eine Endlosschleife geraten.Ja, sehen Sie sich eine Liste der Themen an . Viele Beispiele auf dieser Seite.
Das ist programmgesteuert. Wenn Sie nur eine Liste unter Linux wünschen, können Sie einfach diesen Befehl verwenden:
und die VM führt einen Thread-Dump für stdout durch.
quelle
In der ThreadMXBean können Sie viele Informationen zu Threads abrufen .
Rufen Sie die statische ManagementFactory.getThreadMXBean () -Methode auf, um einen Verweis auf die MBean abzurufen.
quelle
Haben Sie sich jconsole angesehen? ?
Dadurch werden alle Threads aufgelistet, die für einen bestimmten Java-Prozess ausgeführt werden.
Sie können jconsole über den Ordner JDK bin starten.
Sie können auch eine vollständige Stapelverfolgung für alle Threads erhalten, indem Sie
Ctrl+Break
in Windows klicken oderkill pid --QUIT
Linux senden .quelle
Apache Commons-Benutzer können verwenden
ThreadUtils
. Die aktuelle Implementierung verwendet den zuvor beschriebenen Ansatz "Walk the Thread Group".quelle
Sie können so etwas ausprobieren:
und Sie können natürlich mehr Fadencharakteristik erhalten, wenn Sie benötigen.
quelle
In Groovy können Sie private Methoden aufrufen
In Java können Sie diese Methode mithilfe von Reflection aufrufen, sofern der Sicherheitsmanager dies zulässt.
quelle
Code-Snippet, um eine Liste der Threads zu erhalten, die vom Haupt-Thread gestartet wurden:
Ausgabe:
Wenn Sie alle Threads einschließlich Systemthreads benötigen, die nicht von Ihrem Programm gestartet wurden, entfernen Sie die folgende Bedingung.
Jetzt ausgeben:
quelle
quelle
Drücken Sie in der Java-Konsole Strg-Pause . Es werden alle Threads sowie einige Informationen zum Heap aufgelistet. Dadurch erhalten Sie natürlich keinen Zugriff auf die Objekte. Aber es kann trotzdem sehr hilfreich beim Debuggen sein.
quelle
Mit dem folgenden Befehl können Sie eine Liste der Threads und ihrer vollständigen Status mithilfe des Terminals abrufen:
Welche PID ist die ID des Prozesses, der auf Ihrem Computer ausgeführt wird? Um die Prozess-ID Ihres Java-Prozesses abzurufen, können Sie einfach den
jps
Befehl ausführen .Sie können auch Ihren Thread-Dump analysieren, der von jstack in TDAs (Thread Dump Analyzer) wie einem Fastthread- oder Spotify-Thread-Analyzer-Tool erstellt wurde .
quelle
ManagementFactory.getThreadMXBean().getAllThreadIds()
quelle