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

Gim*_*ima 24 java fork-join java-8 forkjoinpool java-stream

以下是我对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获得的流进行并行操作?

Chr*_*ies 13

Wrt在哪里记录了Java 8并行流使用FJ Framework?

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

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

Wrt替换线程池

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

Wrt取代了Streams api

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

PS(wrt ForkJoin和Streams)

如果您有兴趣,我想请注意,我偶然发现了使用FJ池的一些问题,请参阅,例如


dus*_*ltz 5

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

“...Stream 接口使您有机会在不费力的情况下对数据集合并行执行操作。”

“...您将看到 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");

正如评论和其他答案中所述,这并不意味着它将始终使用 fork/join。


归档时间:

查看次数:

6295 次

最近记录:

9 年,11 月 前