Thread
.getAllStackTraces()
.keySet()
.stream()
.map(
$->{
System.out.println
($.getStackTrace());
return $;
});
我覺得那不是做到這一點的最好辦法。有沒有其他的方法? 最簡單的方法是什麼?使用流API。 (需要打印整個堆棧跟蹤)
Thread
.getAllStackTraces()
.keySet()
.stream()
.map(
$->{
System.out.println
($.getStackTrace());
return $;
});
我覺得那不是做到這一點的最好辦法。有沒有其他的方法? 最簡單的方法是什麼?使用流API。 (需要打印整個堆棧跟蹤)
怎麼樣:Thread.getAllStackTraces().keySet().stream().map(Thread::getStackTrace).map(Arrays::toString).forEach(System.out::println)
?
編輯:上面的代碼需要一些編輯才能看起來不錯。這裏是一個更好的格式版本:
Thread.getAllStackTraces()
.keySet()
.stream()
.map(Thread::getStackTrace)
.map(Arrays::asList)
.forEach(list -> System.out.println(list.stream()
.map(i -> i.toString())
.collect(Collectors.joining("\n\t"))))
[Ljava.lang.StackTraceElement; @ 4c873330 [Ljava.lang.StackTraceElement; @ 119d7047 [Ljava.lang.StackTraceElement; @ 776ec8df [Ljava.lang.StackTraceElement; @ 4eec7777 [Ljava.lang.StackTraceElement; @ 3b07d329多數民衆贊成它是什麼它打印!不是正確的答案 – strash
它應該打印您以前提到的相同的東西。如果你想打印其他東西,只需將''''System.out :: println'''改爲你選擇的函數 – Igor
需要整個堆棧跟蹤 – strash
你知道,那Thread.getAllStackTraces()
返回已經包含了所有的堆棧跟蹤一個Map
?遍歷Thread
鍵集,調用Thread.getStackTrace()
,這不僅浪費資源,而且還會增加獲得較少有用結果的機會,因爲在迭代時線程可能會終止,導致空棧跟蹤,而Map
包含您在調用getAllStackTraces()
時所做的快照。
你可以簡單地遍歷值改爲:
Thread.getAllStackTraces().values().stream()
.flatMap(Arrays::stream)
.forEach(System.out::println);
雖然這種滿足只是打印所有堆棧跟蹤的要求,這格式化輸出是不太可能有用。
您可能希望:
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' ..... –
你正在做一些額外的工作,如果你想獲得每個堆棧跟蹤?在任何人提出解決方案之前,這是你的追求? (順便說一下,它們不是列表,它們是'StackTraceElement []',並且它們可能會很昂貴*)。 – Makoto
你可以寫一個代碼來獲得真正的堆棧嗎? – strash