モジュール java.base
パッケージ java.util.concurrent

クラスForkJoinPool

java.lang.Object
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ForkJoinPool
すべての実装されたインタフェース:
AutoCloseable, Executor, ExecutorService

public class ForkJoinPool extends AbstractExecutorService
ForkJoinTaskを実行するためのExecutorService ForkJoinPoolは、ForkJoinTask以外のクライアントからの送信のほか、管理および監視操作のためのエントリ・ポイントを提供します。

ForkJoinPoolは、主にwork-stealingを使用する点で、他の種類のExecutorServiceとは異なります。プール内のすべてのスレッドが、プールに送信されたタスク、他のアクティブなタスクによって作成されたタスク、あるいはその両方を見つけて実行しようとします(1つも存在しない場合は、最終的に作業の待機がブロックされます)。 これにより、(ほとんどのForkJoinTaskと同様に)ほとんどのタスクが他のサブタスクを生成する場合や、外部のクライアントからプールに小さいタスクが数多く送信される場合に、効率的な処理が可能になります。 特に、コンストラクタでasyncModeをtrueに設定した場合、 ForkJoinPoolは結合されないイベント形式のタスクでの使用にも適している可能性があります。 すべてのワーカー・スレッドは、Thread.isDaemon() set trueで初期化されます。

静的commonPool()が利用可能であり、ほとんどの適用に適しています。 共通プールは、指定されたプールに明示的に送信されないForkJoinTaskで使用されます。 共通プールを使用すると、通常はリソースの使用量が減少します(そのスレッドは未使用時にゆっくりと回収され、その後の使用時に復帰します)。

個別または独自のプールを必要とする適用では、特定のターゲット並列性レベル(デフォルトでは使用可能なプロセッサの数と同じ)で ForkJoinPoolを構築できます。 このプールは、一部のタスクがほかのタスクの結合を待機して停止している場合でも、内部ワーカー・スレッドを動的に追加、中断、または再開することによって、十分な数のアクティブな(または使用可能な)スレッドを維持しようとします。 ただし、ブロックされた入出力やその他の管理されていない同期が存在する場合、このような調整は保証されません。 ネストされたForkJoinPool.ManagedBlockerインタフェースを使用すると、対応可能な同期の種類を拡張できます。 デフォルトのポリシーは、クラスThreadPoolExecutorに記述されているパラメータに対応するパラメータを持つコンストラクタを使用してオーバーライドできます。

実行およびライフ・サイクル制御メソッドに加えて、このクラスは、分岐/結合アプリケーションの開発、チューニング、および監視を支援することを目的にしたステータス・チェック・メソッド(たとえばgetStealCount())を提供します。 また、toString()メソッドも、プール状態の指示を非公式の監視に便利な形式で返します。

ほかのExecutorServiceと同様に、次の表に要約されている3つの主なタスク実行メソッドがあります。 これらは主に、現在のプール内の分岐/結合計算にまだ関与していないクライアントによって使用されるように設計されています。 これらのメソッドのメインの形式はForkJoinTaskのインスタンスを受け入れますが、オーバーロードされた形式では、プレーンな RunnableまたはCallableベースのアクティビティの混在実行も許可されます。 ただし、すでにプール内で実行されているタスクでは、通常結合されない非同期イベント形式のタスクを使用しないかぎり、通常はかわりにこの表に示されている計算内の形式を使用するようにしてください。その場合、選択するメソッドに違いはほとんどありません。

タスク実行メソッドのサマリー
分岐/結合以外のクライアントからの呼び出し 分岐/結合計算内からの呼び出し
非同期実行の調整 execute(ForkJoinTask) ForkJoinTask.fork()
結果の待機および取得 invoke(ForkJoinTask) ForkJoinTask.invoke()
実行の調整およびFutureの取得 submit(ForkJoinTask) ForkJoinTask.fork() (ForkJoinTask Future)

共通プールを構築するために使用されるパラメータは、次のシステム・プロパティを設定することで制御できます:

システム・プロパティを介してスレッド・ファクトリが提供されない場合、共通プールは、システム・クラス・ローダーを「スレッド・コンテキスト・クラス・ローダー」として使用するファクトリを使用します。 また、SecurityManagerが存在する場合、共通プールは、Permissionsが有効になっていないファクトリ供給スレッドを使用し、タスク全体でThreadLocal変数の値を保持することは保証されません。 これらの設定時にエラーが発生した場合は、デフォルト・パラメータが使用されます。 並列性プロパティをゼロに設定するか、nullを返すことができるファクトリを使用するか、あるいはその両方によって、共通プール内のスレッドの使用を無効化または制限できます。 ただし、その場合は、結合されていないタスクがまったく実行されなくなる可能性があります。

実装上のノート:
この実装では、実行中のスレッドの最大数を32767に制限します。 最大数を超えるプールを作成しようとすると、 IllegalArgumentExceptionが発生します。 また、この実装では、プールが停止されたか内部リソースが使い果たされた場合にのみ、送信されたタスク(つまり、RejectedExecutionExceptionをスロー)が拒否されます。
導入されたバージョン:
1.7