ストリームフレームワーク of Java 8:
誰かがすでに 方法を見つけました ストリームフレームワークの並列実行でカスタムスレッドプールを使用することはできますが、私は一生の間Java 8 APIデフォルトのJava 8つの並列ストリーム実装は ForkJoinPool#commonPool() を使用します。( Collection#parallelStream() 、-のメソッド StreamSupport クラス、およびAPI内の並列対応ストリームのその他の可能なソース(私にはわかりません)。
検索結果からキラリと光る一口だけが次のとおりです。
ラムダの状態:ライブラリ版(「ボンネットの下の並列処理」)
StreamフレームワークとFork/Join機構について漠然と言及しています。
フォーク/ジョイン機構は、このプロセスを自動化するように設計されています。
JEP 107:コレクションのバルクデータ操作
Collectionインターフェースのデフォルトメソッド#parallelStream()がFork/Joinを使用してそれ自体を実装することをほぼ直接述べています。しかし、それでも共通プールについては何もありません。
並列実装は、Java 7。で導入されたJava.util.concurrency Fork/Join実装に基づいています。
したがって: Collection#parallelStream() 。
クラス配列(Javadoc)
共通プールが使用されていることを複数回直接述べます。
ForkJoin共通プールは、並列タスクを実行するために使用されます。
だから私の質問は:
ForkJoinPool#commonPool() は、Java 8 APIから取得されるストリームの並列操作に使用されると言われていますか?
W.r.t。 Java 8つの並列ストリームがFJフレームワークを使用することはどこに文書化されていますか?
Afaik(Java 1.8u5)並列ストリームのJavaDocには、一般的なForkJoinPoolが使用されていることは記載されていません。
ただし、 http://docs.Oracle.com/javase/tutorial/essential/concurrency/forkjoin.html の下部にあるForkJoinのドキュメントに記載されています。
W.r.t。スレッドプールの置き換え
私の理解では、(一般的なものの代わりに)カスタムForkJoinPoolを使用できます Java 8並列ストリーム -のカスタムスレッドプールを参照してくださいが、カスタムThreadPoolは使用できません)これはForkJoinの実装とは異なります(ここに未解決の質問があります: Java並列ストリームの共通スレッドプールバックエンドを(グローバルに)置き換える方法? )
W.r.t。 Streams APIの置き換え
チェックアウトすることができます https://github.com/nurkiewicz/LazySeq これはもっとScalaストリームの実装のようです-とても素敵で、とても興味深いです
PS(w.r.t。ForkJoin and Streams)
興味のある方は、FJプールの使用に関するいくつかの問題に遭遇したことに注意してください。
価値があるものとして、Java 8 in Actionには並列データ処理とパフォーマンス(第7章)に関する章があります。
「... Streamインターフェースを使用すると、データの収集に対して多くの労力をかけずに操作を並行して実行できます。」
「... Javaがこの魔法をどのように実現できるか、より実際的には、Java 7. "
また、セクション7.1に小さな補足事項があります。
「並列ストリームは内部でデフォルトのForkJoinPoolを使用します...デフォルトでは、
Runtime.getRuntime().availableProcessors().
によって返されるプロセッサと同じ数のスレッドがあります。」「次の例のように、システムプロパティJava.util .concurrent.ForkJoinPool.common.parallelismを使用して、このプールのサイズを変更できます。」
System.setProperty("Java.util.concurrent.ForkJoinPool.common.parallelism","12");
コメントやその他の回答で述べたように、これは常にフォーク/ジョインを使用するという意味ではありません。
GrepCodeで端末操作のソースコードを確認できます。たとえば、 ForEachOp を見てみましょう。ご覧のとおり、ForEachOpのevaluateParallelメソッドは、ForkJoinTaskから派生した CountedCompleter から派生したForEachTaskオブジェクトを作成して呼び出します。