Snippet di codice per ottenere l'elenco degli articoli di thread 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<Thread> 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();
}
}
}
uscita:
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 avete bisogno di tutte le discussioni tra le discussioni di sistema, che non sono state iniziate da programma, rimuovere sotto condizione.
if (t.getThreadGroup() == Thread.currentThread().getThreadGroup())
Ora d'uscita:
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
fonte
2016-07-30 15:19:37
Sebbene molto più pulito rispetto all'altra alternativa proposta, questo ha lo svantaggio di incorrere nel costo di ottenere tracce di stack per tutti i thread. Se userete comunque quelle tracce dello stack, questo è chiaramente superiore. In caso contrario, questo potrebbe essere significativamente più lento per nessun guadagno oltre al codice pulito. – Eddie
@Eddie È un'ipotesi dal senso comune o hai fatto esperimenti? "significativamente più lento" dici; quanto più lento? Ne vale la pena? Mi interrogo su ogni tentativo di peggiorare il codice per motivi di efficienza. Se hai un requisito di efficienza _e_ un'infrastruttura per misurare quantitativamente l'efficienza, allora sto bene con le persone che stanno peggiorando il codice, perché sembrano sapere cosa stanno facendo. Vedi [la radice di tutti i mali] (http: //en.wikipedia.org/wiki/Program_optimization # When_to_optimize) secondo Donald Knuth. – thejoshwolfe
Non ho cronometrato queste alternative specifiche, ma ho lavorato con altri mezzi Java per raccogliere tracce di stack vs solo un elenco di thread. L'impatto sulle prestazioni sembra dipendere molto fortemente da quale JVM stai usando (JRockit vs Sun JVM per esempio). Vale la pena misurare nell'istanza specifica. Che ti influenzino o meno dipende dalla tua scelta JVM e dal numero di thread che hai. Ho scoperto che ottenere tutte le tracce dello stack tramite ThreadMXBean.dumpAllThreads per circa 250 thread richiedeva 150 - 200 msec mentre ottenevo solo l'elenco di thread (senza tracce) per non essere misurabile (0 msec). – Eddie