web-dev-qa-db-ja.com

Javaの並列ストリーム操作はフォーク/結合を使用すると公式ドキュメントはどこに述べていますか?

ストリームフレームワーク of Java 8:

  1. 何かがソースを作成します Stream
  2. 実装は、BaseStream#parallel()メソッドを提供する責任があります。このメソッドは、操作を並行して実行できるStreamを返します。

誰かがすでに 方法を見つけました ストリームフレームワークの並列実行でカスタムスレッドプールを使用することはできますが、私は一生の間Java 8 APIデフォルトのJava 8つの並列ストリーム実装は ForkJoinPool#commonPool() を使用します。( Collection#parallelStream() 、-のメソッド StreamSupport クラス、およびAPI内の並列対応ストリームのその他の可能なソース(私にはわかりません)。

検索結果からキラリと光る一口だけが次のとおりです。


だから私の質問は:

ForkJoinPool#commonPool() は、Java 8 APIから取得されるストリームの並列操作に使用されると言われていますか?

26
Gima

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プールの使用に関するいくつかの問題に遭遇したことに注意してください。

13
Christian Fries

価値があるものとして、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");

コメントやその他の回答で述べたように、これは常にフォーク/ジョインを使用するという意味ではありません。

4
dustin.schultz

GrepCodeで端末操作のソースコードを確認できます。たとえば、 ForEachOp を見てみましょう。ご覧のとおり、ForEachOpのevaluateParallelメソッドは、ForkJoinTaskから派生した CountedCompleter から派生したForEachTaskオブジェクトを作成して呼び出します。

1
mkrakhin