Czy jest jakiś sposób, aby uzyskać listę wszystkich działających wątków w bieżącej maszynie JVM (w tym wątki, które nie zostały uruchomione przez moją klasę)?
Czy możliwe jest również uzyskanie Thread
i Class
obiektów wszystkich wątków na liście?
Chcę móc to zrobić za pomocą kodu.
java
multithreading
jvm
Kryten
źródło
źródło
Uzyskaj uchwyt do katalogu głównego
ThreadGroup
, w ten sposób:Teraz
enumerate()
kilkakrotnie wywoływaj funkcję w grupie głównej. Drugi argument pozwala uzyskać rekurencyjnie wszystkie wątki:Zwróć uwagę, jak wywołujemy enumerate (), aż tablica będzie wystarczająco duża, aby pomieścić wszystkie wpisy.
źródło
rootGroup
powinieneś użyćnew Thread[rootGroup.activeCount()+1]
.activeCount()
może wynosić zero, a jeśli tak, to wpadniesz w nieskończoną pętlę.Tak, spójrz na listę wątków . Wiele przykładów na tej stronie.
To zrobić to programowo. Jeśli chcesz tylko listę w systemie Linux, możesz po prostu użyć tego polecenia:
a maszyna wirtualna wykona zrzut wątku na standardowe wyjście.
źródło
Możesz uzyskać wiele informacji o wątkach z ThreadMXBean .
Wywołaj metodę static ManagementFactory.getThreadMXBean () , aby uzyskać odwołanie do komponentu MBean.
źródło
Spojrzałeś na jconsole ?
Spowoduje to wyświetlenie listy wszystkich wątków uruchomionych dla określonego procesu Java.
Możesz uruchomić jconsole z folderu bin JDK.
Możesz także uzyskać pełny stos śledzenia dla wszystkich wątków, naciskając
Ctrl+Break
w systemie Windows lub wysyłająckill pid --QUIT
w systemie Linux.źródło
Użytkownicy Apache Commons mogą korzystać
ThreadUtils
. W bieżącej implementacji zastosowano wcześniej opisane podejście „spacer po grupie wątków”.źródło
Możesz spróbować czegoś takiego:
i możesz oczywiście uzyskać więcej cech wątku, jeśli potrzebujesz.
źródło
W Groovy możesz wywoływać metody prywatne
W Javie można wywołać tę metodę za pomocą odbicia, pod warunkiem, że zezwala na to menedżer bezpieczeństwa.
źródło
Fragment kodu, aby uzyskać listę wątków rozpoczynanych od głównego wątku:
wynik:
Jeśli potrzebujesz wszystkich wątków, w tym wątków systemowych, które nie zostały uruchomione przez program, usuń poniższy warunek.
Teraz wyjście:
źródło
źródło
W konsoli Java naciśnij Ctrl-Break . Spowoduje to wyświetlenie listy wszystkich wątków oraz niektórych informacji o stercie. To oczywiście nie da ci dostępu do obiektów. Ale i tak może być bardzo pomocne przy debugowaniu.
źródło
Aby uzyskać listę wątków i ich pełnych stanów za pomocą terminala, możesz użyć następującego polecenia:
Który PID jest identyfikatorem procesu uruchomionego na twoim komputerze. Aby uzyskać identyfikator procesu java, wystarczy uruchomić
jps
polecenie.Ponadto możesz analizować zrzut wątku wygenerowany przez jstack w TDA (Thread Dump Analyzer), taki jak narzędzie szybkiej analizy wątku lub spotify .
źródło
ManagementFactory.getThreadMXBean().getAllThreadIds()
źródło