官方文档在哪里说Java的并行流操作使用fork/join?

以下是我对Java 8的Stream框架的理解:

  1. 某些内容创建了源
  2. 该实现负责提供 BaseStream#parallel() 方法,该方法又返回一个可以并行运行其操作的 Stream。

虽然有人已经找到了一种方法将自定义线程池与Stream框架的并行执行一起使用,但我无法在Java 8 API中找到任何提及默认Java 8并行Stream实现将使用ForkJoinPool#commonPool()的提及。(Collection#parallelStream()StreamSupport类中的方法,以及我不知道的API中支持并行的其他流的其他可能来源)。

我唯一能从搜索结果中闪耀的花絮是这些:


所以我的问题是:

哪里说ForkJoinPool#commonPool()用于从Java 8 API获得的流的并行操作?


答案 1

W.r.t. Java 8 并行流使用 FJ 框架的记录在哪里?

Afaik(Java 1.8u5)在并行流的JavaDoc中没有提到使用通用的ForkJoinPool。

但是在ForkJoin文档底部的 http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

W.r.t. 替换线程池

我的理解是,你可以使用自定义的ForkJoinPool(而不是通用的)——参见Java 8并行流中的自定义线程池——但不是与ForkJoin实现不同的自定义ThreadPool(我在这里有一个悬而未决的问题:如何(全局)替换Java并行流的公共线程池后端? )

W.r.t. 替换 Streams api

你可以看看 https://github.com/nurkiewicz/LazySeq 这是一个更像Scala的流实现 - 非常好,非常有趣

PS (w.r.t. ForkJoin and Streams)

如果您有兴趣,我想指出,我在使用FJ池时偶然发现了一些问题,请参阅,例如


答案 2

就其价值而言,Java 8 in Action有一章是关于并行数据处理和性能的(第7章)。它说:

"...流接口使您有机会对数据集合并行执行操作,而无需花费太多精力。

"...你会看到Java如何通过采用Java 7中引入的fork/join框架来实现这种魔力,或者更实际地看到并行流如何在引擎盖下工作。

它还在第7.1节中有一个小的旁注:

“并行流内部使用默认的 ForkJoinPool...默认情况下,它具有与处理器一样多的线程,由Runtime.getRuntime().availableProcessors()."

“您可以使用系统属性 java.util .concurrent 更改此池的大小。ForkJoinPool.common.parallelism,如以下示例所示:”

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");

正如评论和其他答案中提到的,这并不意味着它将始终使用分叉/连接。


推荐