2017-04-12 31 views
-1

我想是這樣如何打印線程的列表與Java 8個流API

Thread 
     .getAllStackTraces() 
     .keySet() 
     .stream() 
     .map(
       $->{ 
        System.out.println 
        ($.getStackTrace()); 
        return $; 
        }); 

我覺得那不是做到這一點的最好辦法。有沒有其他的方法? 最簡單的方法是什麼?使用流API。 (需要打印整個堆棧跟蹤)

+3

'forEach' ..... –

+3

你正在做一些額外的工作,如果你想獲得每個堆棧跟蹤?在任何人提出解決方案之前,這是你的追求? (順便說一下,它們不是列表,它們是'StackTraceElement []',並且它們可能會很昂貴*)。 – Makoto

+0

你可以寫一個代碼來獲得真正的堆棧嗎? – strash

回答

1

修訂(THX @Flown)

試試這個:

Thread 
     .getAllStackTraces() 
     .keySet() 
     .forEach($ -> System.out.println(Arrays.toString($.getStackTrace())); 
+0

嗯它應該打印? – strash

+2

一個不能簡單地打印一個數組,並期望輸出清晰可辨... – Makoto

+2

將sysout包裝到'Arrays.toString($。getStackTrace())' – Flown

4

怎麼樣: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")))) 
+0

[Ljava.lang.StackTraceElement; @ 4c873330 [Ljava.lang.StackTraceElement; @ 119d7047 [Ljava.lang.StackTraceElement; @ 776ec8df [Ljava.lang.StackTraceElement; @ 4eec7777 [Ljava.lang.StackTraceElement; @ 3b07d329多數民衆贊成它是什麼它打印!不是正確的答案 – strash

+2

它應該打印您以前提到的相同的東西。如果你想打印其他東西,只需將''''System.out :: println'''改爲你選擇的函數 – Igor

+0

需要整個堆棧跟蹤 – strash

5

你知道,那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)); 
});