public class ForkJoinPool extends AbstractExecutorService
ForkJoinTask
を実行するための ExecutorService
。ForkJoinPool
は、ForkJoinTask
以外のクライアントからの送信のほか、管理および監視操作のためのエントリポイントを提供します。
ForkJoinPool
は、主に work-stealing を使用する点で、ほかの種類の ExecutorService
とは異なります。プール内のすべてのスレッドが、ほかのアクティブなタスクによって作成されたサブタスクを見つけて実行しようとします (1 つも存在しない場合は、最終的に作業の待機がブロックされます)。これにより、ほとんどのタスクがほかのサブタスクを生成する場合の効率的な処理が可能になります (ほとんどの ForkJoinTask
も同様です)。コンストラクタで asyncMode を true に設定する場合は、ForkJoinPool
もまた、結合されることのないイベント形式のタスクでの使用に適している可能性があります。
ForkJoinPool
は、デフォルトでは使用可能なプロセッサの数に等しい、特定のターゲット並列性レベルで構築されます。このプールは、一部のタスクがほかのタスクの結合を待機して停止している場合でも、内部ワーカースレッドを動的に追加、中断、または再開することによって、十分な数のアクティブな (または使用可能な) スレッドを維持しようとします。ただし、ブロックされた入出力やその他の管理されていない同期が存在する場合、このような調整は保証されません。ネストされた ForkJoinPool.ManagedBlocker
インタフェースを使用すると、対応可能な同期の種類を拡張できます。
実行およびライフサイクル制御メソッドに加えて、このクラスは、分岐/結合アプリケーションの開発、チューニング、および監視を支援することを目的にしたステータスチェックメソッド (たとえば getStealCount()
) を提供します。また、toString()
メソッドも、プール状態の指示を非公式の監視に便利な形式で返します。
ほかの ExecutorService と同様に、次の表に要約されている 3 つの主なタスク実行メソッドがあります。これらは、まだ現在のプール内の分岐/結合計算に関与していないクライアントによって使用されるように設計されています。これらのメソッドのメインの形式は ForkJoinTask
のインスタンスを受け入れますが、オーバーロードされた形式では、プレーンな Runnable
または Callable
ベースのアクティビティーの混在実行も許可されます。ただし、すでにプール内で実行されているタスクは通常、これらのプール実行メソッドを使用するべきではなく、代わりにこの表に示されている計算内の形式を使用してください。
分岐/結合以外のクライアントからの呼び出し | 分岐/結合計算内からの呼び出し | |
非同期実行の調整 | execute(ForkJoinTask) |
ForkJoinTask.fork() |
結果の待機および取得 | invoke(ForkJoinTask) |
ForkJoinTask.invoke() |
実行の調整および Future の取得 | submit(ForkJoinTask) |
ForkJoinTask.fork() (ForkJoinTask は Future) |
使用例。 通常は、プログラムまたはサブシステム内のすべての並列タスク実行のために 1 つの ForkJoinPool
が使用されます。それ以外の使用は一般に、大量のスレッドを作成する場合の構築や登録のオーバーヘッドより重要とは言えません。たとえば、RecursiveAction
で示されている SortTasks
には一般的なプールを使用できます。ForkJoinPool
はスレッドをデーモンモードで使用するため、通常、プログラムの終了時にこのようなプールに対して明示的に shutdown
を実行する必要はありません。
static final ForkJoinPool mainPool = new ForkJoinPool(); ... public void sort(long[] array) { mainPool.invoke(new SortTask(array, 0, array.length)); }
実装上の注意: この実装では、実行中のスレッドの最大数を 32767 に制限します。
最大数を超えるプールを作成しようとすると、IllegalArgumentException
が発生します。
この実装では、送信されたタスクを (RejectedExecutionException
をスローすることによって) 拒否するのは、プールがシャットダウンされているか、または内部リソースが使い果たされた場合だけです。
修飾子と型 | クラスと説明 |
---|---|
static interface |
ForkJoinPool.ForkJoinWorkerThreadFactory
新しい
ForkJoinWorkerThread を作成するためのファクトリです。 |
static interface |
ForkJoinPool.ManagedBlocker
ForkJoinPool 内で実行中のタスクについての管理対象の並列性を拡張するためのインタフェースです。 |
修飾子と型 | フィールドと説明 |
---|---|
static ForkJoinPool.ForkJoinWorkerThreadFactory |
defaultForkJoinWorkerThreadFactory
新しい ForkJoinWorkerThread を作成します。
|
コンストラクタと説明 |
---|
ForkJoinPool()
並列性が
Runtime.availableProcessors() と等しく、デフォルトのスレッドファクトリを使用し、UncaughtExceptionHandler を指定せず、非同期 LIFO 処理モードを使用して ForkJoinPool を作成します。 |
ForkJoinPool(int parallelism)
指定された並列性レベルを持ち、デフォルトのスレッドファクトリを使用し、UncaughtExceptionHandler を指定せず、非同期 LIFO 処理モードを使用して
ForkJoinPool を作成します。 |
ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)
指定されたパラメータを使って
ForkJoinPool を作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
boolean |
awaitTermination(long timeout, TimeUnit unit)
シャットダウン要求後にすべてのタスクが実行を完了していたか、タイムアウトが発生するか、現在のスレッドで割り込みが発生するか、そのいずれかが最初に発生するまでブロックします。
|
protected int |
drainTasksTo(Collection<? super ForkJoinTask<?>> c)
実行されなかった、送信およびフォークされた使用可能なすべてのタスクをスケジュールキューから削除し、実行ステータスを変更せずにそれらを指定されたコレクションに追加します。
|
void |
execute(ForkJoinTask<?> task)
指定されたタスクの (非同期) 実行を調整します。
|
void |
execute(Runnable task)
将来のどの時点かで、指定されたコマンドを実行します。
|
int |
getActiveThreadCount()
現在タスクを横取りまたは実行しているスレッドの推定数を返します。
|
boolean |
getAsyncMode()
結合されないフォークされたタスクについて、このプールがローカルの先入れ先出しスケジュールモードを使用している場合、
true を返します。 |
ForkJoinPool.ForkJoinWorkerThreadFactory |
getFactory()
新規ワーカーの構築に使用されるファクトリを返します。
|
int |
getParallelism()
このプールのターゲット並列性レベルを返します。
|
int |
getPoolSize()
開始したがまだ終了していないワーカースレッド数を返します。
|
int |
getQueuedSubmissionCount()
このプールに送信された、まだ実行が開始されていないタスクの推定数を返します。
|
long |
getQueuedTaskCount()
ワーカースレッドによって現在キューに保持されているタスクの総数の推定値を返します (プールに送信された、まだ開始されていないタスクは含まない)。
|
int |
getRunningThreadCount()
タスクの結合またはその他の管理対象同期の待機をブロックしない、ワーカースレッドの推定数を返します。
|
long |
getStealCount()
1 つのスレッドのワークキューから別のスレッドによって横取りされたタスクの総数の推定値を返します。
|
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler()
タスクを実行中に発生した回復不能なエラーが原因で終了した内部ワーカースレッド用のハンドラを返します。
|
boolean |
hasQueuedSubmissions()
このプールに送信された、まだ実行が開始されていないタスクがある場合は
true を返します。 |
<T> T |
invoke(ForkJoinTask<T> task)
指定されたタスクを実行し、完了時にその結果を返します。
|
<T> List<Future<T>> |
invokeAll(Collection<? extends Callable<T>> tasks)
指定されたタスクを実行し、すべて完了すると、ステータスと結果を含む Future のリストを返します。
|
boolean |
isQuiescent()
すべてのワーカースレッドが現在アイドル状態の場合に
true を返します。 |
boolean |
isShutdown()
このプールがシャットダウンしていた場合、
true を返します。 |
boolean |
isTerminated()
シャットダウンに続いてすべてのタスクが完了していた場合、
true を返します。 |
boolean |
isTerminating()
終了処理が開始されたがまだ完了していない場合、
true を返します。 |
static void |
managedBlock(ForkJoinPool.ManagedBlocker blocker)
指定されたブロッカに合わせてブロックします。
|
protected <T> RunnableFuture<T> |
newTaskFor(Callable<T> callable)
指定された呼び出し可能タスクの RunnableFuture を返します。
|
protected <T> RunnableFuture<T> |
newTaskFor(Runnable runnable, T value)
指定された実行可能タスクおよびデフォルト値の RunnableFuture を返します。
|
protected ForkJoinTask<?> |
pollSubmission()
まだ実行されていない次の送信が使用可能な場合、それを削除して復帰します。
|
void |
shutdown()
順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。
|
List<Runnable> |
shutdownNow()
すべてのタスクの取り消しまたは停止を行い、あとで送信されたすべてのタスクを拒否することを試みます。
|
<T> ForkJoinTask<T> |
submit(Callable<T> task)
値を返す実行用タスクを送信して、保留状態のタスク結果を表す Future を返します。
|
<T> ForkJoinTask<T> |
submit(ForkJoinTask<T> task)
実行用の ForkJoinTask を送信します。
|
ForkJoinTask<?> |
submit(Runnable task)
実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。
|
<T> ForkJoinTask<T> |
submit(Runnable task, T result)
実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。
|
String |
toString()
実行状態、並列性レベル、およびワーカーおよびタスクカウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。
|
invokeAll, invokeAny, invokeAny
public static final ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory
public ForkJoinPool()
Runtime.availableProcessors()
と等しく、デフォルトのスレッドファクトリを使用し、UncaughtExceptionHandler を指定せず、非同期 LIFO 処理モードを使用して ForkJoinPool
を作成します。SecurityException
- セキュリティーマネージャーが存在し、呼び出し元が RuntimePermission
("modifyThread")
を持たないためスレッドを変更できない場合public ForkJoinPool(int parallelism)
ForkJoinPool
を作成します。parallelism
- 並列性レベルIllegalArgumentException
- 並列性がゼロ以下か、実装限界より大きいSecurityException
- セキュリティーマネージャーが存在し、呼び出し元が RuntimePermission
("modifyThread")
を持たないためスレッドを変更できない場合public ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)
ForkJoinPool
を作成します。parallelism
- 並列性レベル。デフォルト値の場合、Runtime.availableProcessors()
を使用します。factory
- 新しいスレッドを作成するためのファクトリ。デフォルト値の場合、defaultForkJoinWorkerThreadFactory
を使用します。handler
- タスクの実行中に検出された回復不可能なエラーのために終了する内部ワーカースレッドのためのハンドラ。デフォルト値の場合、null
を使用します。asyncMode
- true の場合は、結合されないフォークされたタスクに対して、ローカルの先入れ先出しスケジュールモードを確立する。このモードは、ワーカースレッドがイベント形式の非同期タスクのみを処理するアプリケーションでは、デフォルトのローカルのスタックベースモードより適している場合がある。デフォルト値の場合、false
を使用します。IllegalArgumentException
- 並列性がゼロ以下か、実装限界より大きいNullPointerException
- ファクトリが null の場合SecurityException
- セキュリティーマネージャーが存在し、呼び出し元が RuntimePermission
("modifyThread")
を持たないためスレッドを変更できない場合public <T> T invoke(ForkJoinTask<T> task)
ex.printStackTrace()
を使用して表示された) スタックトレースを含みます。task
- タスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public void execute(ForkJoinTask<?> task)
task
- タスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public void execute(Runnable task)
Executor
task
- 実行可能なタスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(ForkJoinTask<T> task)
task
- 送信するタスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(Callable<T> task)
ExecutorService
タスクの待機をただちにブロックする場合は、result = exec.submit(aCallable).get(); の形式の構築を使用できます。
注:Executors
クラスには、クロージャーに似たほかの一般オブジェクトを変換できるメソッドセットが含まれます。たとえば、PrivilegedAction
を Callable
形式に変換して、送信可能にすることができます。
submit
、インタフェース: ExecutorService
submit
、クラス: AbstractExecutorService
task
- 送信するタスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(Runnable task, T result)
ExecutorService
submit
、インタフェース: ExecutorService
submit
、クラス: AbstractExecutorService
task
- 送信するタスクresult
- 返す結果NullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public ForkJoinTask<?> submit(Runnable task)
ExecutorService
submit
、インタフェース: ExecutorService
submit
、クラス: AbstractExecutorService
task
- 送信するタスクNullPointerException
- タスクが null の場合RejectedExecutionException
- タスクの実行をスケジュールできない場合public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
ExecutorService
Future.isDone()
は true になります。完了したタスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。invokeAll
、インタフェース: ExecutorService
invokeAll
、クラス: AbstractExecutorService
tasks
- タスクのコレクションNullPointerException
- タスクまたはそのいずれかの要素が null の場合RejectedExecutionException
- いずれかのタスクの実行をスケジュールできない場合public ForkJoinPool.ForkJoinWorkerThreadFactory getFactory()
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
null
public int getParallelism()
public int getPoolSize()
getParallelism()
とは異なる可能性があります。public boolean getAsyncMode()
true
を返します。true
public int getRunningThreadCount()
public int getActiveThreadCount()
public boolean isQuiescent()
true
を返します。アイドルワーカーとは、ほかのスレッドから横取りできるタスクがなく、プールへの保留中の送信も存在しないために、実行するタスクを取得できないワーカーのことです。このメソッドは控えめです。すべてのスレッドがアイドルになってもすぐには true
を返さない可能性がありますが、スレッドが非アクティブのままであれば、最終的には true になります。true
public long getStealCount()
public long getQueuedTaskCount()
public int getQueuedSubmissionCount()
public boolean hasQueuedSubmissions()
true
を返します。true
protected ForkJoinTask<?> pollSubmission()
null
protected int drainTasksTo(Collection<? super ForkJoinTask<?>> c)
c
に要素を追加しようとしているときに障害が検出されると、関連付けられた例外がスローされたときに、要素がどちらのコレクションにも存在しない場合と、どちらかまたは両方のコレクションに存在する場合があります。オペレーションの進行中に、指定されたコレクションが変更された場合の、このオペレーションの動作は定義されていません。c
- 要素の転送先のコレクションpublic String toString()
public void shutdown()
SecurityException
- セキュリティーマネージャーが存在し、呼び出し元が RuntimePermission
("modifyThread")
を持たないためスレッドを変更できない場合public List<Runnable> shutdownNow()
SecurityException
- セキュリティーマネージャーが存在し、呼び出し元が RuntimePermission
("modifyThread")
を持たないためスレッドを変更できない場合public boolean isTerminated()
true
を返します。true
public boolean isTerminating()
true
を返します。このメソッドはデバッグに便利なことがあります。シャットダウンのあと十分に時間が経ってから報告された true
の戻り値は、送信されたタスクが割り込みを無視または抑制したか、あるいは入出力を待機しているために、この executor が適切に終了されないことを示す可能性があります。タスクは通常、ブロック操作を必要としてはいけないことを記載している ForkJoinTask
クラスの注意事項を参照してください。ただし、必要としている場合は、割り込みでそれを強制的に中止する必要があります。true
public boolean isShutdown()
true
を返します。true
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 待機する最長時間unit
- timeout 引数の時間単位true
。終了前にタイムアウトが経過した場合は false
InterruptedException
- 待機中に割り込みが発生した場合public static void managedBlock(ForkJoinPool.ManagedBlocker blocker) throws InterruptedException
ForkJoinWorkerThread
である場合、このメソッドは、アクティブにされるスペアスレッドを必要に応じて調整して、現在のスレッドがブロックされている間の十分な並列性を確保する可能性があります。
呼び出し側が ForkJoinTask
でない場合、このメソッドの動作は次と同等です。
while (!blocker.isReleasable())
if (blocker.block())
return;
呼び出し側が ForkJoinTask
である場合は、プールがまず並列性を確保するように拡張され、あとで調整される可能性があります。blocker
- ブロッカInterruptedException
- blocker.block がそれを実行した場合protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value)
AbstractExecutorService
newTaskFor
、クラス: AbstractExecutorService
runnable
- ラップされる実行可能タスクvalue
- 返される Future のデフォルト値protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable)
AbstractExecutorService
newTaskFor
、クラス: AbstractExecutorService
callable
- ラップされる呼び出し可能タスク バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.