Code-Snippet Liste der Themen von Haupt-Thread zu erhalten begonnen:
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();
}
}
}
Ausgang:
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
Wenn Sie alle Themen benötigen, einschließlich System-Threads, die von Ihrem Programm nicht gestartet haben, Unter Bedingung entfernen.
if (t.getThreadGroup() == Thread.currentThread().getThreadGroup())
Jetzt Ausgabe:
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
Obwohl viel sauberer als die andere vorgeschlagene Alternative, hat dies den Nachteil, dass die Kosten für das Erhalten von Stack-Traces für alle Threads entstehen. Wenn Sie diese Stack-Spuren trotzdem verwenden, ist dies eindeutig besser. Wenn nicht, dann kann dies wesentlich langsamer sein, wenn es keinen anderen Gewinn als sauberen Code gibt. – Eddie
@Eddie Ist das eine Annahme aus dem gesunden Menschenverstand oder hast du Experimente gemacht? "deutlich langsamer" sagst du; Wie viel langsamer? Ist es das wert? Ich stelle jeden Versuch in Frage, den Code im Interesse der Effizienz schlechter zu machen. Wenn Sie eine Effizienzanforderung und eine Infrastruktur haben, um die Effizienz quantitativ zu messen, dann bin ich damit einverstanden, dass Leute Code schlechter machen, weil sie zu wissen scheinen, was sie tun. Siehe [die Wurzel allen Übels] (http: //en.wikipedia.org/wiki/Programmoptimierung # When_to_optimize) nach Donald Knuth. – thejoshwolfe
Ich habe diese spezifischen Alternativen nicht zeitlich festgelegt, aber ich habe mit anderen Java-Mitteln gearbeitet, um Stack-Traces zu sammeln, anstatt nur eine Liste von Threads. Die Auswirkungen auf die Performance scheinen sehr stark davon abhängig zu sein, welche JVM Sie verwenden (JRockit vs Sun JVM zum Beispiel). Es lohnt sich, in Ihrer spezifischen Instanz zu messen. Ob Sie davon betroffen sind oder nicht, hängt von Ihrer JVM-Auswahl und davon ab, wie viele Threads Sie haben. Ich fand, dass alle Stack-Traces über ThreadMXBean.dumpAllThreads für etwa 250 Threads 150 - 200 ms benötigten, während nur die Liste der Threads (ohne Traces) nicht messbar war (0 ms). – Eddie