Gim*_*ima 24 java fork-join java-8 forkjoinpool java-stream
以下是我对Java 8 的Stream框架的理解:
虽然有人已经找到了一种方法来使用自定义线程池和Stream框架的并行执行,但我不能在Java 8 API中找到任何提及默认Java 8并行Stream实现将使用ForkJoinPool#commonPool()的内容.(Collection#parallelStream(),StreamSupport类中的方法,以及API中我不知道的其他可能的并行启用流源).
我只能搜索搜索结果的花絮是:
Lambda的状态:Libraries Edition("引擎盖下的并行")
Vaguely提到Stream框架和Fork/Join机制.
Fork/Join机器旨在实现此过程的自动化.
JEP 107:集合的批量数据操作
几乎直接表明Collection接口的默认方法#parallelStream()使用Fork/Join实现自身.但仍然没有关于公共池.
并行实现基于Java 7中引入的java.util.concurrency Fork/Join实现.
类数组(Javadoc)
直接表示使用公共池的多次.
ForkJoin公共池用于执行任何并行任务.
所以我的问题是:
在哪里说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池的一些问题,请参阅,例如
就其价值而言,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 次 |
| 最近记录: |