繁体   English   中英

如何使用Java 8流API打印线程列表

[英]How to print a list of threads with Java 8 stream api

我尝试了类似的东西

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

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

您是否知道Thread.getAllStackTraces()返回一个已经包含所有堆栈跟踪的Map 遍历Thread键集以Thread.getStackTrace()每个调用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));
});

怎么样: 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"))))

更新 (thx @Flown)

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM