【问题标题】:How to print a list of threads with Java 8 stream api如何使用 Java 8 流 api 打印线程列表
【发布时间】:2023-03-18 07:51:01
【问题描述】:

我尝试了类似的东西

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

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

【问题讨论】:

  • forEach?.....
  • 如果你想获得每个堆栈跟踪,你正在做额外的工作。在任何人提出解决方案之前,这就是你所追求的吗? (顺便说一下,它们不是列表,它们是 StackTraceElement[],生成它们可能昂贵。)
  • 你能写一段获取真正栈的代码吗?

标签: java algorithm collections java-8


【解决方案1】:

您知道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));
});

【讨论】:

    【解决方案2】:

    怎么样: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 这就是它打印的内容!!!!不是正确的答案
    • 它应该打印您之前提到的相同内容。如果您希望它打印其他内容,只需将 System.out::println 更改为您选择的功能
    • 需要整个堆栈跟踪
    • 请查看我更新的答案以打印数组列表
    • 请随意。请记住,如果您想要特定的格式,则必须更具体(即每行上的单个元素带有悬挂缩进和痕迹之间的双倍空格)
    【解决方案3】:

    更新(感谢@Flown)

    试试这个:

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

    【讨论】:

    • 嗯应该打印吗?
    • 不能简单地打印一个数组并期望输出是可理解的......
    • 将系统输出包装到Arrays.toString($.getStackTrace())
    • 完美运行我竖起大拇指,你是-1,但你仍然跳过主题流集合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多