如何使用Java 8 stream api打印线程列表

str*_*ash -1 java algorithm collections java-8

我试过类似的东西

  Thread
        .getAllStackTraces()
        .keySet()
        .stream()
        .map(
                $->{
                    System.out.println
                    ($.getStackTrace());
                    return $;
                    });
Run Code Online (Sandbox Code Playgroud)

我觉得这不是最好的方法.还有其他方法吗? 最简单的方法是什么?使用Stream API.(需要打印整个堆栈跟踪)

Hol*_*ger 6

您知道吗,Thread.getAllStackTraces()返回Map已包含所有堆栈跟踪的内容?迭代Thread密钥集,调用Thread.getStackTrace()它们中的每一个,不仅浪费资源,而且还增加了获得较少有用结果的机会,因为线程可能在迭代时终止,导致空堆栈跟踪,而Map包含在您调用时创建的快照getAllStackTraces().

您可以简单地迭代值:

Thread.getAllStackTraces().values().stream()
      .flatMap(Arrays::stream)
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

虽然这满足了仅打印所有堆栈跟踪的要求,但这种未格式化的输出不太可能有用.

您可能更喜欢:

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));
});
Run Code Online (Sandbox Code Playgroud)