Java >> Java tutorial >  >> JVM

Få alle kørende JVM-tråde

1. Oversigt

I denne korte vejledning lærer vi, hvordan dufår alle kørende tråde i den aktuelle JVM , inklusive de tråde, der ikke er startet af vores klasse.

2. Brug tråden Klasse

getAllStackTrace() metoden for Tråden klasse giver et stakspor af alle de løbende tråde. Det returnerer et Kort hvis nøgler er tråden objekter, så vi kan få nøglen sat og ganske enkelt sløjfe dens elementer for at få information om trådene.

Lad os bruge printf() metode til at gøre output mere læsbart:

Set<Thread> threads = Thread.getAllStackTraces().keySet();
System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : threads) {
    System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}

Outputtet vil se sådan ud:

Name            	 State           	 Priority        	 isDaemon
main            	 RUNNABLE        	 5               	 false
Signal Dispatcher 	 RUNNABLE        	 9               	 true
Finalizer       	 WAITING         	 8               	 true
Reference Handler 	 WAITING         	 10              	 true

Som vi ser, udover tråd hoved , som kører hovedprogrammet, har vi tre andre tråde. Dette resultat kan variere med forskellige Java-versioner.

Lad os lære lidt mere om disse andre tråde:

  • Signalafsender :denne tråd håndterer signaler sendt af operativsystemet til JVM.
  • Afslutter :denne tråd udfører færdiggørelser for objekter, der ikke længere behøver at frigive systemressourcer.
  • Referencebehandler :denne tråd sætter objekter, der ikke længere er nødvendige, i køen for at blive behandlet af Finalizer tråd.

Alle disse tråde vil blive afsluttet, hvis hovedprogrammet afsluttes.

3. Brug ThreadUtils Klasse fra Apache Commons

Vi kan også bruge ThreadUtils klasse fra Apache Commons Lang-biblioteket for at opnå det samme mål:

Lad os tilføje en afhængighed til vores pom.xml fil:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.10</version>
</dependency>

Og brug blot getAllThreads() metode til at få alle kørende tråde:

System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : ThreadUtils.getAllThreads()) {
    System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}

Outputtet er det samme som ovenfor.

4. Konklusion

Sammenfattende har vi lært to metoder til at få alle kørende tråde i den aktuelle JVM .


Java tag