Sind Sie sich bewusst, dass Thread.getAllStackTraces()
eine Map
zurückgibt, die bereits alle Stack-Traces enthält? Iterieren über die Thread
Keyset, um Thread.getStackTrace()
für jeden von ihnen zu nennen, ist nicht nur eine Verschwendung von Ressourcen, sondern erhöht auch die Chancen, weniger nützliche Ergebnisse zu erhalten, wie Threads können während Sie iterieren beendet, was zu leeren Stack-Traces führt, während die Map
enthält einen Snapshot, der zu dem Zeitpunkt erstellt wurde, als Sie getAllStackTraces()
aufgerufen haben.
Sie können einfach die Werte iterieren statt:
Thread.getAllStackTraces().values().stream()
.flatMap(Arrays::stream)
.forEach(System.out::println);
Während dies die Anforderung erfüllt nur alle Stack-Traces drucken, diese unformatierte Ausgabe ist unwahrscheinlich, nützlich zu sein.
können Sie bevorzugen:
Thread.getAllStackTraces().forEach((t,st) -> {
System.out.printf("Thread %4d %-20s %13s pri=%d%n",
t.getId(), t.getName(), t.getState(), t.getPriority());
Arrays.stream(st).forEachOrdered(ste -> System.out.println("\tat "+ste));
});
'forEach' ..... –
Sie machen zusätzliche Arbeit, wenn Sie jede Stack-Trace zu bekommen?. Bevor jemand eine Lösung anspricht, ist das, wonach Sie suchen? (Sie sind übrigens keine Listen, sie sind 'StackTraceElement []' und sie können * teuer * generiert werden.) – Makoto
Kannst du einen Code schreiben, der den richtigen Stack bekommt? – strash