官方文档在哪里说Java';s并行流操作是否使用fork/join?
以下是我对Java 8应用程序的理解:官方文档在哪里说Java';s并行流操作是否使用fork/join?,java,java-8,fork-join,java-stream,forkjoinpool,Java,Java 8,Fork Join,Java Stream,Forkjoinpool,以下是我对Java 8应用程序的理解: 某物创造了一个源头 实现负责提供一个方法,该方法反过来返回一个可以并行运行其操作的流 虽然已经有人在流框架的并行执行中使用了自定义线程池,但我在Java8API中找不到默认Java8并行流实现将使用的任何内容。(,类中的方法,以及API中支持并行的流的其他可能来源,我不知道) 我能从搜索结果中发现的唯一花絮是: 模糊地提到了流框架和Fork/Join机制 叉形/连接机械设计用于实现此过程的自动化 几乎直接指出,集合接口的默认方法#parallel
虽然已经有人在流框架的并行执行中使用了自定义线程池,但我在Java8API中找不到默认Java8并行流实现将使用的任何内容。(,类中的方法,以及API中支持并行的流的其他可能来源,我不知道) 我能从搜索结果中发现的唯一花絮是:
模糊地提到了流框架和Fork/Join机制 叉形/连接机械设计用于实现此过程的自动化
几乎直接指出,集合接口的默认方法#parallelStream()使用Fork/Join实现自身。但对公共泳池还是一无所知 并行实现基于java 7中引入的java.util.concurrency Fork/Join实现 因此:
直接多次声明使用了公共池 ForkJoin公共池用于执行任何并行任务
所以我的问题是:
哪里说用于对从Java 8 API获得的流执行并行操作?您可以在GrepCode上查看终端操作的源代码。例如,让我们看一看。如您所见,ForEachOp的evaluateParallel方法创建并调用ForEachTask对象,该对象是从ForkJoinTask派生的。W.r.t.哪里有文件证明Java 8并行流使用FJ框架? Afaik(Java1.8u5)在并行流的JavaDoc中没有提到使用公共ForkJoinPool 但是在本文档底部的ForkJoin文档中提到了它 W.r.t.更换线程池 我的理解是,您可以使用定制的ForkJoinPool(而不是普通的ForkJoinPool) -请参阅-,但不是一个与ForkJoin实现不同的自定义线程池(我这里有一个未决问题:) W.r.t.更换Streams api 您可以检查哪个更像Scala的streams实现——非常好,非常有趣 PS(w.r.t.ForkJoin和Streams) 如果您感兴趣,我想指出,我在使用FJ池时偶然发现了一些问题,请参阅,例如
Runtime.getRuntime().availableProcessors()返回。
“
“您可以使用系统属性java.util更改此池的大小
.concurrent.ForkJoinPool.common.parallelism,如下例所示:
System.setProperty(“java.util.concurrent.ForkJoinPool.common.parallelism”,“12”)代码>
正如在评论和其他答案中提到的,这并不意味着它将始终使用fork/join。的最后一段似乎指出了这一点(“fork/join框架的另一个实现由java.util.streams包中的方法使用,它是java SE 8发行版计划的Project Lambda的一部分。”),但这对我来说不是很满意。。。我想,像这样的实现细节可能没有被包括在内,以允许未来的发展,但考虑到实现细节被包括在如此多的其他地方,这没有多大意义…还有另一个提示(“通过聚合操作,Java运行时为您执行此分区和组合解决方案。”),但同样,它并不像您希望的那样明确……它可能没有在API中声明,原因在另一条评论中提到:这是一个实现细节。我找到的最正式的资源(除了代码-这是作弊;-)was,其中Doug Lea表示“ForkJoinPool公共池在JDK8中用于所有并行流操作、并行排序等。“……我仍然认为这是一个实现细节。”Stuart Marks警告不要想当然地处理太多的实现细节。文档中有一个有趣的例子,他们根据ForkJoinPool.getCommonPoolParallelism()
计算批大小。但是没有提到fork/join。链接的fork/join教程确实说明使用了fork/join的一些实现,但没有提到#commonPool()。听起来像是JodaStreams的时代……这很好,但《Java8在行动》这本书不是官方文档。因此我说,“为了它的价值”。尽管如此,这是一本评价很高的书,如果它是错的,评论家会这么说。问题是它是否被指定了。如果没有指定,那么它可以由不同的JDK供应商以不同的方式实现,或者可能在OpenJDK的未来版本中更改。如果它被指定,它将永远保持不变。我无法想象JDK作者停止更改内部实现仅仅是因为这会使某本评价很高的书中的语句无效。斯图尔特标记没有指定。什么?!JDK开发人员不会与书籍作者合作来确保