【问题标题】:When parallel streams are combined together java 8?当并行流组合在一起java 8?
【发布时间】:2020-03-26 09:31:00
【问题描述】:

我怀疑何时将所有流合并以获得结果? 如果我有员工类并且必须获得最高薪水的前 5 名员工 ID,我可以使用并行流,但它在内部如何工作?

以下是代码。它在内部如何运作?据我说,很明显这次在listA.parallelStream()创建了并行流,但是什么时候合并在一起?

List<Employee> listA =  new ArrayList<Employee>();
listA.parallelStream()
     .sorted(((e1,e2) -> e2.salary.compareTo(e1.salary)))
     .filter(e1 -> e1.salary > 50000)
     .limit(5)
     .map(e -> e.eID)
     .collect(Collectors.toList());

【问题讨论】:

  • 它们在收集器中组合在一起,使用它的“组合器”。
  • 当代码以声明方式编写时,实现会处理细节。你说“我希望这个列表被并行处理,最后应该收集一个结果”,而不关心“如何”。该实现负责同步这些线程以提取一个结果。换句话说,如果您需要了解它是如何工作的,请查看适用的实现代码或文档。
  • Collectors.toList 有一个组合器可以添加到 Slaw 的评论中,例如 (left, right) -&gt; { left.addAll(right); return left; }
  • @slaw 那么根据这个限制(5)和地图也在各个流中计算?
  • 这能回答你的问题吗? How Java8's Collection.parallelStream works?

标签: java java-8 parallel-processing java-stream


【解决方案1】:

并行或顺序是“完整”流的属性,而不是它的一部分。因此,所有的计算链(管道)都是并行完成的,从分裂到适当程度的源(通常是 fork/join 池中的默认线程数),直到终端操作(收集/恢复)这是从平行链收集所有内容的争论点。因此,当向源声明数据并生成数据时,该数据将被注入到由专用线程管理的管道中(线程之间没有“数据移动”)。

然后在您的示例中,例如 sorted 操作将仅对给定线程将看到通过它的内容进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2016-02-28
    • 2016-08-27
    相关资源
    最近更新 更多