Ottieni un elenco di tutti i thread attualmente in esecuzione in Java

C’è un modo per ottenere una lista di tutti i thread in esecuzione nella JVM corrente (inclusi i thread NON avviati dalla mia class)?

È anche ansible ottenere gli oggetti Thread e Class di tutti i Thread nell’elenco?

Voglio essere in grado di farlo attraverso il codice.

Per ottenere un set iterabile:

Set threadSet = Thread.getAllStackTraces().keySet(); 

Per convertirlo in un array:

 Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]); 

Ottieni un handle nel ThreadGroup radice, come questo:

 ThreadGroup rootGroup = Thread.currentThread().getThreadGroup(); ThreadGroup parentGroup; while ((parentGroup = rootGroup.getParent()) != null) { rootGroup = parentGroup; } 

Ora chiama la funzione enumerate() sul gruppo radice ripetutamente. Il secondo argomento ti consente di ottenere tutti i thread, in modo ricorsivo:

 Thread[] threads = new Thread[rootGroup.activeCount()]; while (rootGroup.enumerate(threads, true ) == threads.length) { threads = new Thread[threads.length * 2]; } 

Si noti come chiamiamo enumerate () ripetutamente finché la matrice non è abbastanza grande da contenere tutte le voci.

Sì, dai un’occhiata a ottenere un elenco di discussioni . Un sacco di esempi su quella pagina.

Questo è farlo a livello di programmazione. Se vuoi solo una lista su Linux, almeno puoi semplicemente usare questo comando:

 kill -3 processid 

e la VM farà un dump del thread allo stdout.

È ansible ottenere molte informazioni sui thread da ThreadMXBean .

Chiamare il metodo statico ManagementFactory.getThreadMXBean () per ottenere un riferimento all’MBean.

Hai dato un’occhiata a jconsole ?

Questo elencherà tutti i thread in esecuzione per un particolare processo Java.

È ansible avviare jconsole dalla cartella bin JDK.

Puoi anche ottenere una traccia stack completa per tutti i thread premendo Ctrl+Break in Windows o inviando kill pid --QUIT in Linux.

In Groovy puoi chiamare metodi privati

 // Get a snapshot of the list of all threads Thread[] threads = Thread.getThreads() 

In Java , è ansible richiamare tale metodo utilizzando la reflection a condizione che il responsabile della sicurezza lo consenta.

Nella console java, premi Ctrl-Break . Elencherà tutti i thread più alcune informazioni sull’heap. Questo non ti darà accesso agli oggetti, naturalmente. Ma può essere molto utile per il debug comunque.

Puoi provare qualcosa come questo:

 Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive())); 

e puoi ovviamente ottenere più caratteristiche di filo se ne hai bisogno.

  public static void main(String[] args) { // Walk up all the way to the root thread group ThreadGroup rootGroup = Thread.currentThread().getThreadGroup(); ThreadGroup parent; while ((parent = rootGroup.getParent()) != null) { rootGroup = parent; } listThreads(rootGroup, ""); } // List all threads and recursively list all subgroup public static void listThreads(ThreadGroup group, String indent) { System.out.println(indent + "Group[" + group.getName() + ":" + group.getClass()+"]"); int nt = group.activeCount(); Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate nt = group.enumerate(threads, false); // List every thread in the group for (int i=0; i 

Snippet di codice per ottenere l’elenco dei thread avviati dalla discussione principale:

 import java.util.Set; public class ThreadSet { public static void main(String args[]) throws Exception{ Thread.currentThread().setName("ThreadSet"); for ( int i=0; i< 3; i++){ Thread t = new Thread(new MyThread()); t.setName("MyThread:"+i); t.start(); } Set threadSet = Thread.getAllStackTraces().keySet(); for ( Thread t : threadSet){ if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){ System.out.println("Thread :"+t+":"+"state:"+t.getState()); } } } } class MyThread implements Runnable{ public void run(){ try{ Thread.sleep(5000); }catch(Exception err){ err.printStackTrace(); } } } 

produzione:

 Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING Thread :Thread[ThreadSet,5,main]:state:RUNNABLE 

Se sono necessari tutti i thread, inclusi i thread di sistema, che non sono stati avviati dal programma, rimuovere le condizioni seguenti.

 if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()) 

Ora prodotto:

 Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING Thread :Thread[Reference Handler,10,system]:state:WAITING Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING Thread :Thread[ThreadSet,5,main]:state:RUNNABLE Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING Thread :Thread[Finalizer,8,system]:state:WAITING Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE Thread :Thread[Attach Listener,5,system]:state:RUNNABLE 

Gli utenti comuni di Apache possono usare ThreadUtils. L’implementazione corrente utilizza l’approccio del gruppo thread prima descritto in precedenza.

 for (Thread t : ThreadUtils.getAllThreads()) { System.out.println(t.getName() + ", " + t.isDaemon()); } 

ManagementFactory.getThreadMXBean().getAllThreadIds()