public class ForkJoinPool extends AbstractExecutorService
ForkJoinTaskを実行するためのExecutorService。ForkJoinPoolは、ForkJoinTask以外のクライアントからの送信のほか、管理および監視操作のためのエントリ・ポイントを提供します。
ForkJoinPoolは、主にwork-stealingを使用する点で、他の種類のExecutorServiceとは異なります。プール内のすべてのスレッドが、プールに送信されたタスク、他のアクティブなタスクによって作成されたタスク、あるいはその両方を見つけて実行しようとします(1つも存在しない場合は、最終的に作業の待機がブロックされます)。これにより、(ほとんどのForkJoinTaskと同様に)ほとんどのタスクが他のサブタスクを生成する場合や、外部のクライアントからプールに小さいタスクが数多く送信される場合に、効率的な処理が可能になります。特に、コンストラクタでasyncModeをtrueに設定した場合、ForkJoinPoolは結合されないイベント形式のタスクでの使用にも適している可能性があります。
静的commonPool()が利用可能であり、ほとんどの適用に適しています。共通プールは、指定されたプールに明示的に送信されないForkJoinTaskで使用されます。共通プールを使用すると、通常はリソースの使用量が減少します(そのスレッドは未使用時にゆっくりと回収され、その後の使用時に復帰します)。
個別または独自のプールを必要とする適用では、特定のターゲット並列性レベル(デフォルトでは使用可能なプロセッサの数と同じ)で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) |
共通プールは、デフォルトではデフォルト・パラメータを使用して構築されますが、これらは3つのシステム・プロパティを設定することで制御できます。
java.util.concurrent.ForkJoinPool.common.parallelism - 並列性レベル(負でない整数)
java.util.concurrent.ForkJoinPool.common.threadFactory - ForkJoinPool.ForkJoinWorkerThreadFactoryのクラス名
java.util.concurrent.ForkJoinPool.common.exceptionHandler - Thread.UncaughtExceptionHandlerのクラス名
SecurityManagerが存在し、ファクトリが指定されていない場合、デフォルト・プールではファクトリが提供する有効なPermissionsを持たないスレッドが使用されます。これらのクラスは、システム・クラス・ローダーを使用してロードされます。これらの設定時にエラーが発生した場合は、デフォルト・パラメータが使用されます。並列性プロパティをゼロに設定するか、nullを返すことができるファクトリを使用するか、あるいはその両方によって、共通プール内のスレッドの使用を無効化または制限できます。ただし、その場合は、結合されていないタスクがまったく実行されなくなる可能性があります。
実装上の注意: この実装では、実行中のスレッドの最大数を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 |
awaitQuiescence(long timeout, TimeUnit unit)
このプール内で動作するForkJoinTaskから呼び出した場合は、
ForkJoinTask.helpQuiesce()と同じ効果があります。 |
boolean |
awaitTermination(long timeout, TimeUnit unit)
シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。
|
static ForkJoinPool |
commonPool()
共通プール・インスタンスを返します。
|
protected int |
drainTasksTo(Collection<? super ForkJoinTask<?>> c)
実行されなかった、送信およびフォークされた使用可能なすべてのタスクをスケジュール・キューから削除し、実行ステータスを変更せずにそれらを指定されたコレクションに追加します。
|
void |
execute(ForkJoinTask<?> task)
指定されたタスクの(非同期)実行を調整します。
|
void |
execute(Runnable task)
将来のどの時点かで、指定されたコマンドを実行します。
|
int |
getActiveThreadCount()
現在タスクを横取りまたは実行しているスレッドの推定数を返します。
|
boolean |
getAsyncMode()
結合されないフォークされたタスクについて、このプールがローカルの先入れ先出しスケジュール・モードを使用している場合、
trueを返します。 |
static int |
getCommonPoolParallelism()
共通プールのターゲット並列性レベルを返します。
|
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, invokeAnypublic 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 static ForkJoinPool commonPool()
shutdown()またはshutdownNow()を試行しても、その実行状態には影響しません。ただし、このプールおよび実行中の処理は、System.exit(int)プログラムで自動的に終了します。プログラムの終了前に非同期タスクの処理が完了することに依存するプログラムは、終了前にcommonPool().awaitQuiescenceを呼び出す必要があります。public <T> T invoke(ForkJoinTask<T> task)
ex.printStackTrace()を使用して表示された)スタック・トレースを含みます。T - タスクの結果の型task - タスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public void execute(ForkJoinTask<?> task)
task - タスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public void execute(Runnable task)
ExecutorExecutor実装により随意に実行できます。task - 実行可能なタスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(ForkJoinTask<T> task)
T - タスクの結果の型task - 送信するタスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(Callable<T> task)
ExecutorServicegetメソッドは、正常に完了した時点でタスクの結果を返します。
タスクの待機をただちにブロックする場合は、result = exec.submit(aCallable).get();の形式の構築を使用できます。
注: Executorsクラスには、クロージャに似たほかの一般オブジェクトを変換できるメソッド・セットが含まれます。たとえば、PrivilegedActionをCallable形式に変換して、送信可能にすることができます。
submit、インタフェース: ExecutorServicesubmit、クラス: AbstractExecutorServiceT - タスクの結果の型task - 送信するタスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public <T> ForkJoinTask<T> submit(Runnable task, T result)
ExecutorServicegetメソッドは、正常に完了した時点で指定された結果を返します。submit、インタフェース: ExecutorServicesubmit、クラス: AbstractExecutorServiceT - 結果の型task - 送信するタスクresult - 返す結果NullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public ForkJoinTask<?> submit(Runnable task)
ExecutorServicegetメソッドは、正常に完了した時点でnullを返します。submit、インタフェース: ExecutorServicesubmit、クラス: AbstractExecutorServicetask - 送信するタスクNullPointerException - タスクがnullの場合RejectedExecutionException - タスクの実行をスケジュールできない場合public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
ExecutorServiceFuture.isDone()はtrueになります。完了したタスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。invokeAll、インタフェース: ExecutorServiceinvokeAll、クラス: AbstractExecutorServiceT - タスクから返される値の型tasks - タスクのコレクションNullPointerException - タスクまたはそのいずれかの要素がnullの場合RejectedExecutionException - いずれかのタスクの実行をスケジュールできない場合public ForkJoinPool.ForkJoinWorkerThreadFactory getFactory()
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
nullpublic int getParallelism()
public static int getCommonPoolParallelism()
public int getPoolSize()
getParallelism()とは異なる可能性があります。public boolean getAsyncMode()
trueを返します。truepublic int getRunningThreadCount()
public int getActiveThreadCount()
public boolean isQuiescent()
trueを返します。アイドル・ワーカーとは、ほかのスレッドから横取りできるタスクがなく、プールへの保留中の送信も存在しないために、実行するタスクを取得できないワーカーのことです。このメソッドは控えめです。すべてのスレッドがアイドルになってもすぐにはtrueを返さない可能性がありますが、スレッドが非アクティブのままであれば、最終的にはtrueになります。truepublic long getStealCount()
public long getQueuedTaskCount()
public int getQueuedSubmissionCount()
public boolean hasQueuedSubmissions()
trueを返します。trueprotected ForkJoinTask<?> pollSubmission()
nullprotected int drainTasksTo(Collection<? super ForkJoinTask<?>> c)
cに要素を追加しようとしているときに障害が検出されると、関連付けられた例外がスローされたときに、要素がどちらのコレクションにも存在しない場合と、どちらかまたは両方のコレクションに存在する場合があります。オペレーションの進行中に、指定されたコレクションが変更された場合の、このオペレーションの動作は定義されていません。c - 要素の転送先のコレクションpublic String toString()
public void shutdown()
commonPool()である場合は、呼び出しても実行状態に影響しません。また、シャットダウン後に呼び出しても効果はありません。このメソッドの実行中に同時に送信されているタスクは拒否される場合と、されない場合があります。SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合public List<Runnable> shutdownNow()
commonPool()である場合は、呼び出しても実行状態に影響しません。また、シャットダウン後に呼び出しても効果はありません。それ以外の場合、このメソッドの実行中に同時に送信または実行されているタスクは、拒否されることも、されないこともあります。このメソッドは、タスクの依存関係が存在する場合に終了できるようにするために、既存のタスクと実行されなかったタスクの両方を取り消します。そのため、このメソッドは(ほかの一部のExecutorの場合とは異なり)常に空のリストを返します。SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合public boolean isTerminated()
trueを返します。truepublic boolean isTerminating()
trueを返します。このメソッドはデバッグに便利なことがあります。シャットダウン後、十分に時間が経ってから報告されたtrueの戻り値は、送信されたタスクが割込みを無視または抑制したか、あるいは入出力を待機しているために、このエグゼキュータが適切に終了されないことを示す可能性があります。タスクは通常、ブロック操作を必要としてはいけないことを記載しているForkJoinTaskクラスの注意事項を参照してください。ただし、必要としている場合は、割込みでそれを強制的に中止する必要があります。truepublic boolean isShutdown()
trueを返します。truepublic boolean awaitTermination(long timeout,
TimeUnit unit)
throws InterruptedException
commonPool()はプログラムがシャットダウンするまで終了しないため、共通プールに適用した場合、このメソッドはawaitQuiescence(long, TimeUnit)と同等ですが、常にfalseを返します。timeout - 待機する最長時間unit - timeout引数の時間単位true。終了前にタイム・アウトが経過した場合はfalseInterruptedException - 待機中に割込みが発生した場合public boolean awaitQuiescence(long timeout,
TimeUnit unit)
ForkJoinTask.helpQuiesce()と同じ効果があります。それ以外の場合は、このプールがisQuiescent()(静止状態)になるか、または指定されたタイムアウトが経過するまで、待機またはタスクの実行の支援(あるいはその両方)を試みます。timeout - 待機する最長時間unit - timeout引数の時間単位true、タイム・アウトが経過した場合はfalse。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)
AbstractExecutorServiceRunnableFutureを返します。newTaskFor、クラス: AbstractExecutorServiceT - 指定された値の型runnable - ラップされる実行可能タスクvalue - 返されるFutureのデフォルト値Futureとして、指定された値をその結果として生成し、基本となるタスクの取消しを提供するRunnableFuture。protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable)
AbstractExecutorServiceRunnableFutureを返します。newTaskFor、クラス: AbstractExecutorServiceT - 呼出し可能タスクの結果の型callable - ラップされる呼出し可能タスクFutureとして、呼出し可能タスクの結果をその結果として生成し、基本となるタスクの取消しを提供するRunnableFuture。 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.