public abstract class ForkJoinTask<V> extends Object implements Future<V>, Serializable
ForkJoinPool
内で実行する抽象基底クラスです。ForkJoinTask
は、通常のスレッドよりはるかに軽量な、スレッドに似たエンティティーです。ある程度の使用制限を犠牲にして、ForkJoinPool 内の少ない数の実際のスレッドで、膨大な数のタスクやサブタスクをホストできます。
「メインの」ForkJoinTask
は、ForkJoinPool
に送信されると実行を開始します。起動されたあと、通常は次に、ほかのサブタスクを起動します。このクラスの名前で示されているように、ForkJoinTask
を使用している多くのプログラムは fork()
メソッドと join()
メソッド、または invokeAll
などの派生メソッドのみを使用します。ただし、このクラスはまた、高度な使用方法で効果を発揮するその他のいくつかのメソッドや、新しい形式の分岐/結合処理のサポートを可能にする拡張機能も提供します。
ForkJoinTask
は、軽量な形式の Future
です。ForkJoinTask
の効率は、純粋な関数を計算するか、または純粋に切り離されたオブジェクトに対して動作するという、計算タスクとしてのその意図した使用方法が反映された (部分的に静的にしか強制できない) 一連の制限から得られます。主な調整メカニズムには、非同期実行を調整する fork()
や、タスクの結果が計算されるまで処理を続行しない join()
があります。計算は、synchronized
メソッドまたはブロックを回避するべきであり、またほかのタスクの結合や、分岐/結合スケジューリングと連携するために通知される Phaser などのシンクロナイザの使用を除き、その他の同期のブロックを最小限に抑えるべきです。タスクもまた、入出力のブロックを実行するべきではなく、また理想的には実行中のほかのタスクからアクセスされる変数とは完全に独立している変数にアクセスするべきです。これらの制限の軽微な侵害 (共有されている出力ストリームの使用など) は、実際には許容できる可能性もありますが、頻繁な使用によってパフォーマンスが低下することがあり、さらに入出力やその他の外部同期を待機していないスレッドの数が使い果たされた場合は、いつまでも停止する可能性があります。この使用制限は、IOExceptions
などのチェック例外をスローできないようにすることによって、ある程度は適用されます。ただし、計算では、結合しようとしている呼び出し側に再スローされる非チェック例外が引き続き発生する可能性があります。これらの例外には、さらに、内部タスクキューの割り当て失敗などの内部リソースの不足によって生成される RejectedExecutionException
が含まれる可能性があります。再スローされた例外は通常の例外と同じように動作しますが、可能な場合は、計算を開始したスレッドと実際に例外が発生しているスレッドの両方 (最小限としては後者のみ) の (たとえば、ex.printStackTrace()
を使用して表示された) スタックトレースを含みます。
タスクの完了を待機し、その結果を抽出するための主要メソッドは join()
ですが、いくつかのバリアントが存在します。Future.get()
メソッドは、完了に対する割り込み可能な待機または時間指定された待機、あるいはその両方をサポートし、結果を Future
の規則を使用して報告します。invoke()
メソッドは、意味的には fork(); join()
と同等ですが、常に現在のスレッドで実行を開始しようとします。これらのメソッドの「非出力」形式は、結果を抽出せず、例外も報告しません。これらは、一連のタスクが実行されていて、そのすべてが完了するまで結果または例外の処理を遅らせる必要がある場合に役立つことがあります。invokeAll
メソッド (複数のバージョンで使用可能) は、もっとも一般的な形式の並列呼び出し、つまり一連のタスクのフォークと、そのすべての結合を実行します。
タスクの実行ステータスは、いくつかの詳細レベルで照会できます。isDone()
は、タスクが何らかの方法で完了した場合 (タスクが実行なしで取り消された場合を含む) に true になります。isCompletedNormally()
は、タスクが取り消しがなく、例外も発生せずに完了した場合に true になります。isCancelled()
は、タスクが取り消された場合に true になります (この場合、getException()
は CancellationException
を返します)。isCompletedAbnormally()
は、タスクが取り消されか、または例外が検出された場合に true になります。この場合、getException()
は、検出された例外または CancellationException
のどちらかを返します。
ForkJoinTask クラスは通常、直接にはサブクラス化されません。代わりに、特定のスタイルの分岐/結合処理をサポートする抽象クラスのいずれかをサブクラス化します。これは通常、結果を返さない計算の場合は RecursiveAction
、結果を返す計算の場合は RecursiveTask
です。通常、具象 ForkJoinTask サブクラスは、コンストラクタで確立されたパラメータから成るフィールドを宣言してから、この基底クラスによって提供される制御メソッドを何らかの方法で使用する compute
メソッドを定義します。これらのメソッドには (異なるタスクサブクラスのインスタンスが互いのメソッドを呼び出せるようにするための) public
アクセスがありますが、一部のメソッドは (inForkJoinPool()
メソッドを使用して特定できる) ほかの ForkJoinTask 内からしか呼び出せません。その他のコンテキストで呼び出そうとすると、例外またはエラーが発生します (ClassCastException
が含まれる可能性があります)。
join()
メソッドとそのバリアントが使用に適しているのは、完了の依存関係が非循環式である場合、つまり、並列計算を無閉路有向グラフ (DAG) として記述できる場合だけです。それ以外の場合は、タスクが循環的に互いを待機するため、実行によってある種のデッドロックが発生する可能性があります。ただし、このフレームワークでは、DAG として静的に構造化されない問題のためのカスタムサブクラスの構築に役立つ可能性のあるその他のメソッドや手法 (たとえば、Phaser
、helpQuiesce()
、および complete(V)
の使用) がサポートされています。
基本となる軽量タスクスケジューリングフレームワークに本質的に結び付けられた実装のオーバーライドを回避するために、ほとんどの基本サポートメソッドは final
です。新しい基本的なスタイルの分岐/結合処理を作成している開発者は、protected
メソッド、exec()
、setRawResult(V)
、および getRawResult()
の実装を最小限にする一方で、そのサブクラスで (おそらく、このクラスによって提供されるほかの protected
メソッドを使用して) 実装できる抽象計算メソッドも導入するようにしてください。
ForkJoinTask では、比較的少ない量の計算を実行するようにしてください。大きなタスクは、通常は再帰的分解を使用して、より小さなサブタスクに分割するようにしてください。非常に大まかな経験則として、1 つのタスクでは 100 より多く 10000 より少ない基本的な計算ステップを実行するようにし、無期限ループを回避するようにしてください。タスクが大きすぎると、並列性によってスループットを向上させることができません。小さすぎると、メモリーや内部タスク保守のオーバーヘッドによって処理効率が低下する可能性があります。
このクラスは、ForkJoinTasks
の実行をほかの種類のタスクと混在させるときに役立つ可能性のある、Runnable
および Callable
のための adapt
メソッドを提供します。すべてのタスクがこの形式である場合は、asyncMode で構築されたプールの使用を検討してください。
ForkJoinTask は Serializable
です。これにより、リモート実行フレームワークなどの拡張機能で使用できるようになります。タスクの直列化は、実行中ではなく、実行の前またはあとにのみ行うのが適切です。実行中は直列化自体が使用されません。
コンストラクタと説明 |
---|
ForkJoinTask() |
修飾子と型 | メソッドと説明 |
---|---|
static <T> ForkJoinTask<T> |
adapt(Callable<? extends T> callable)
指定された
Callable の call メソッドをアクションとして実行する新しい ForkJoinTask を返し、その結果を join() 実行時に返し、発生したチェック例外を RuntimeException に変換します。 |
static ForkJoinTask<?> |
adapt(Runnable runnable)
|
static <T> ForkJoinTask<T> |
adapt(Runnable runnable, T result)
|
boolean |
cancel(boolean mayInterruptIfRunning)
このタスクの実行の取り消しを試みます。
|
void |
complete(V value)
このタスクを実行し、中断または取り消しされていない場合、
join の後続の呼び出しおよび関連の操作の結果として指定された値を返します。 |
void |
completeExceptionally(Throwable ex)
このタスクを強制的に実行し、中断または取り消しされていない場合は、
join および関連の操作の実行時に指定された例外がスローされます。 |
protected abstract boolean |
exec()
このタスクの基本アクションをただちに実行します。
|
ForkJoinTask<V> |
fork()
このタスクを非同期で実行するための調整を行います。
|
V |
get()
必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。
|
V |
get(long timeout, TimeUnit unit)
必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。
|
Throwable |
getException()
基本計算によってスローされた例外を返します。取り消された場合は
CancellationException 、ない場合またはメソッドがまだ実行されていない場合は null を返します。 |
static ForkJoinPool |
getPool()
現在のタスク実行をホストするプール、またはこのタスクが ForkJoinPool の外部で実行している場合は null を返します。
|
static int |
getQueuedTaskCount()
現在のワーカースレッドによってフォークされたが、まだ実行されていないタスクの推定数を返します。
|
abstract V |
getRawResult()
このタスクが異常な状態で実行された場合であっても、
join() によって返される結果を返します。このタスクが実行されたかどうかが不明の場合は、null です。 |
static int |
getSurplusQueuedTaskCount()
現在のワーカースレッドによって保持されているローカルのキューに入っているタスクが、それを横取りする可能性があるほかのワーカースレッドよりもどれだけ多いかの推定値を返します。
|
static void |
helpQuiesce()
現在のタスクをホストしているプールが
休止中 になるまでタスクを実行する可能性があります。 |
static boolean |
inForkJoinPool()
現在のスレッドが、ForkJoinPool 計算として実行される
ForkJoinWorkerThread の場合、true を返します。 |
V |
invoke()
このタスクの実行を開始し、必要な場合は完了まで待機し、その結果を返すか、基本となる計算がそうである場合は、(チェックされない)
RuntimeException または Error をスローします。 |
static <T extends ForkJoinTask<?>> |
invokeAll(Collection<T> tasks)
指定されたコレクション内のすべてのタスクをフォークし、各タスクに対して
isDone が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。 |
static void |
invokeAll(ForkJoinTask<?>... tasks)
指定されたタスクをフォークし、各タスクに対して
isDone が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。 |
static void |
invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
指定されたタスクをフォークし、各タスクに対して
isDone が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。 |
boolean |
isCancelled()
このタスクが正常に完了する前に取り消された場合は true を返します。
|
boolean |
isCompletedAbnormally()
このタスクが例外をスローしたか取り消された場合は
true を返します。 |
boolean |
isCompletedNormally()
このタスクが例外をスローせずに完了し、取り消されなかった場合は
true が返されます。 |
boolean |
isDone()
このタスクが完了した場合は true を返します。
|
V |
join()
計算が完了した
あと 、計算の結果を返します。 |
protected static ForkJoinTask<?> |
peekNextLocalTask()
現在のスレッドによってキューに入れられたがまだ実行されていないタスクがすぐに使用できる場合、そのタスクを返し、スケジュール解除や実行は行いません。
|
protected static ForkJoinTask<?> |
pollNextLocalTask()
現在のスレッドによってキューに入れられたがまだ実行されていない次のタスクを、実行せずにスケジュール解除して復帰します。
|
protected static ForkJoinTask<?> |
pollTask()
現在のスレッドによってキューに入れられたがまだ実行されていない次のタスクが使用可能な場合、そのタスクを実行せずにスケジュール解除して復帰します。そのようなタスクが使用可能でない場合は、ほかのスレッドによってフォークされたタスクが対象になります (使用可能な場合)。
|
void |
quietlyInvoke()
このタスクの実行を開始し、必要な場合は完了まで待機しますが、その結果を返したり例外をスローしたりしません。
|
void |
quietlyJoin()
このタスクを結合し、その結果を返したり例外をスローしたりしません。
|
void |
reinitialize()
このタスクの内部登録状態をリセットし、後続の
fork を許可します。 |
protected abstract void |
setRawResult(V value)
指定された値を結果として返すことを強制します。
|
boolean |
tryUnfork()
このタスクの実行のスケジュール解除を試みます。
|
public final ForkJoinTask<V> fork()
join()
または関連するメソッドを呼び出すか、または true
を返す isDone()
を呼び出さないかぎり、そのタスクを実行しているスレッド以外のスレッドが必ずしも一貫して監視できるわけではありません。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
this
、使用方法を単純化するためpublic final V join()
あと
、計算の結果を返します。このメソッドは、異常な完了によって ExecutionException
ではなく、RuntimeException
または Error
が発生する点、および呼び出し側スレッドの割り込みのためにメソッドが InterruptedException
をスローして突然復帰することがないという点で、get()
とは異なります。public final V invoke()
RuntimeException
または Error
をスローします。public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
isDone
が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。複数のタスクで例外が発生する場合、このメソッドはこれらのいずれかの例外をスローします。いずれかのタスクで例外が発生した場合は、ほかのタスクが取り消されることがあります。ただし、個々のタスクの実行ステータスは例外が返された時点で保証されません。各タスクのステータスは、タスクが取り消されたか、正常に完了したか、例外が発生したか、未処理のままかを確認するための、getException()
および関係するメソッドによって取得できます。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
t1
- 最初のタスクt2
- 2 番目のタスクNullPointerException
- いずれかのタスクが null の場合public static void invokeAll(ForkJoinTask<?>... tasks)
isDone
が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。複数のタスクで例外が発生する場合、このメソッドはこれらのいずれかの例外をスローします。いずれかのタスクで例外が発生した場合、ほかのタスクが取り消される場合があります。ただし、個々のタスクの実行ステータスは例外が返された時点で保証されません。各タスクのステータスは、タスクが取り消されたか、正常に完了したか、例外が発生したか、未処理のままかを確認するための、getException()
および関係するメソッドによって取得できます。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
tasks
- タスクNullPointerException
- いずれかのタスクが null の場合public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks)
isDone
が適用されるか、(チェックされない) 例外が発生する場合に復帰します。後者の場合、例外が再スローされます。複数のタスクで例外が発生する場合、このメソッドはこれらのいずれかの例外をスローします。いずれかのタスクで例外が発生した場合、ほかのタスクが取り消される場合があります。ただし、個々のタスクの実行ステータスは例外が返された時点で保証されません。各タスクのステータスは、タスクが取り消されたか、正常に完了したか、例外が発生したか、未処理のままかを確認するための、getException()
および関係するメソッドによって取得できます。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
tasks
- タスクのコレクションNullPointerException
- タスクまたはいずれかの要素が null の場合public boolean cancel(boolean mayInterruptIfRunning)
cancel
が呼び出されたときにこのタスクが起動されていない場合、このタスクの実行は抑制されます。このメソッドが正常に復帰したあとは、reinitialize()
への介入する呼び出しが存在しないかぎり、isCancelled()
、isDone()
、および cancel
の以降の呼び出しでは true
が返され、join()
および関連するメソッドの呼び出しでは CancellationException
が発生します。
このメソッドはサブクラスでオーバーライドできますが、その場合でも、引き続きこれらのプロパティーが保持されるようにする必要があります。特に、cancel
メソッド自体が例外をスローしてはいけません。
このメソッドは、ほかのタスクから呼び出されるように設計されています。現在のタスクを終了するには、その計算メソッドから非チェック例外を返すか、またはスローするか、あるいは completeExceptionally(java.lang.Throwable)
を呼び出すだけで済みます。
public final boolean isDone()
Future
public final boolean isCancelled()
Future
isCancelled
、インタフェース: Future<V>
public final boolean isCompletedAbnormally()
true
を返します。true
public final boolean isCompletedNormally()
true
が返されます。true
public final Throwable getException()
CancellationException
、ない場合またはメソッドがまだ実行されていない場合は null
を返します。null
public void completeExceptionally(Throwable ex)
join
および関連の操作の実行時に指定された例外がスローされます。このメソッドを使用すると、非同期タスクで例外を引き起こしたり、それ以外の方法では完了しないタスクの完了を強制したりすることができます。これをほかの状況で使用することは推奨されていません。このメソッドはオーバーライド可能ですが、オーバーライドされたバージョンは保証を維持するために super
実装を起動する必要があります。ex
- スローする例外。この例外が RuntimeException
または Error
でない場合、スローされる実際の例外は、原因 ex
を含む RuntimeException
になります。public void complete(V value)
join
の後続の呼び出しおよび関連の操作の結果として指定された値を返します。このメソッドを使用すると、非同期タスクに結果を提供したり、それ以外の方法では正常に完了しないタスクに代わりの処理方法を提供したりすることができます。これをほかの状況で使用することは推奨されていません。このメソッドはオーバーライド可能ですが、オーバーライドされたバージョンは保証を維持するために super
実装を起動する必要があります。value
- このタスクの結果値public final V get() throws InterruptedException, ExecutionException
get
、インタフェース: Future<V>
CancellationException
- 計算が取り消された場合ExecutionException
- 計算で例外がスローされた場合InterruptedException
- 現在のスレッドが ForkJoinPool のメンバーでなく、待機中に割り込みが発生した場合public final V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
get
、インタフェース: Future<V>
timeout
- 待機する最長時間unit
- timeout 引数の時間単位CancellationException
- 計算が取り消された場合ExecutionException
- 計算で例外がスローされた場合InterruptedException
- 現在のスレッドが ForkJoinPool のメンバーでなく、待機中に割り込みが発生した場合TimeoutException
- 待機がタイムアウトになった場合public final void quietlyJoin()
public final void quietlyInvoke()
public static void helpQuiesce()
休止中
になるまでタスクを実行する可能性があります。このメソッドは、多数のタスクがフォークされるが、どのタスクも明示的には結合されず、代わりにすべてが処理されるまで実行する設計で役立つことがあります。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
public void reinitialize()
fork
を許可します。このメソッドを使用すると、このタスクを繰り返し再利用できますが、それが可能なのは、このタスクがフォークされていないか、またはフォークされたあとに完了し、かつこのタスクの未処理の結合もすべて完了しているときに再利用が発生した場合だけです。その他のすべての使用条件の下での効果は保証されません。このメソッドは、ループ内でサブタスクの事前に構築されたツリーを実行するときに役立つことがあります。
このメソッドが完了すると、isDone()
は false
を報告し、getException()
は null
を報告します。ただし、getRawResult
によって返される値は影響を受けません。この値をクリアーするには、setRawResult(null)
を呼び出すことができます。
public static ForkJoinPool getPool()
null
inForkJoinPool()
public static boolean inForkJoinPool()
ForkJoinWorkerThread
の場合、true
を返します。ForkJoinWorkerThread
である場合は true
。それ以外の場合は false
public boolean tryUnfork()
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
true
public static int getQueuedTaskCount()
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
public static int getSurplusQueuedTaskCount()
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
public abstract V getRawResult()
join()
によって返される結果を返します。このタスクが実行されたかどうかが不明の場合は、null
です。このメソッドは、デバッグを支援したり、拡張機能をサポートするためのものです。これをほかのコンテキストで使用することは推奨されていません。null
(完了しない場合)protected abstract void setRawResult(V value)
value
- 値protected abstract boolean exec()
complete(V)
の明示的な呼び出しが Joinable になる必要がある非同期アクションでは false を返す場合があります。また、異常終了を示す (非チェック) 例外をスローする場合もあります。true
(正常に完了した場合)protected static ForkJoinTask<?> peekNextLocalTask()
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
null
protected static ForkJoinTask<?> pollNextLocalTask()
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
null
protected static ForkJoinTask<?> pollTask()
null
の結果は、必ずしもこのタスクが動作しているプールの休止を示すわけではありません。
このメソッドは主に拡張機能をサポートするためのもので、ほかの用途で使用されることはまれです。
このメソッドは、ForkJoinPool
計算の内部からのみ起動できます (メソッド inForkJoinPool()
を使用して決定されます)。ほかのコンテキストから起動しようとすると、例外またはエラーになります (ClassCastException
を含む場合もあります)。
null
public static ForkJoinTask<?> adapt(Runnable runnable)
runnable
- 実行可能アクションpublic static <T> ForkJoinTask<T> adapt(Runnable runnable, T result)
runnable
- 実行可能アクションresult
- 完了時の結果public static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable)
Callable
の call
メソッドをアクションとして実行する新しい ForkJoinTask
を返し、その結果を join()
実行時に返し、発生したチェック例外を RuntimeException
に変換します。callable
- 呼び出し可能なアクション バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.