ForkJoinTask クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
内で ForkJoinPool
実行されるタスクの抽象基本クラス。
[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IFuture
- 継承
- 派生
- 属性
- 実装
注釈
内で ForkJoinPool
実行されるタスクの抽象基本クラス。 は ForkJoinTask
スレッドに似たエンティティであり、通常のスレッドよりもはるかに軽量です。 膨大な数のタスクとサブタスクは、いくつかの使用制限の価格で、ForkJoinPool 内の少数の実際のスレッドによってホストされる可能性があります。
"メイン" ForkJoinTask
は、明示的に にForkJoinPool
送信されたときに実行を開始します。ForkJoin 計算にまだ関与していない場合は、 、、または 関連するメソッドを介して#fork
#invoke
開始されますForkJoinPool#commonPool()
。 開始すると、通常は他のサブタスクが開始されます。 このクラスの名前で示されているように、 を使用する ForkJoinTask
多くのプログラムでは、 メソッド #fork
と #join
、または などの #invokeAll(ForkJoinTask...) invokeAll
派生物のみが使用されています。 ただし、このクラスには、高度な使用法で使用できる他の多くのメソッドと、新しい形式のフォーク/結合処理をサポートできる拡張メカニズムも用意されています。
は ForkJoinTask
の軽量な形式です Future
。 の効率は、純粋関数をForkJoinTask
計算したり、純粋に分離されたオブジェクトを操作したりする計算タスクとして使用メインを反映する一連の制限 (部分的に静的に強制可能な制限) に由来します。 主な調整メカニズムは、 #fork
非同期実行を配置する と です。このメカニズムは、 #join
タスクの結果が計算されるまで続行されません。 計算では、メソッドやブロックを回避 synchronized
するのが理想的であり、他のタスクへの参加や、フォーク/結合スケジューリングと連携するようにアドバタイズされる Phasers などのシンクロナイザーの使用を除き、他のブロック同期を最小限に抑える必要があります。 また、サブ分割可能なタスクはブロック I/O を実行せず、他の実行中のタスクからアクセスされる変数とは完全に独立した変数にアクセスするのが理想的です。 これらのガイドラインは、スローされるなどの IOExceptions
チェックされた例外を許可しないことによって、緩やかに適用されます。 ただし、計算で未チェックの例外が引き続き発生する可能性があります。これは、それらを結合しようとしている呼び出し元に再スローされます。 これらの例外には、内部タスク キューの割り当て失敗など、内部リソースの枯渇に起因する例外も含まれます RejectedExecutionException
。 再スロー例外は通常の例外と同じように動作しますが、可能な場合は、計算を開始したスレッドと実際に例外が発生したスレッドの両方のスタック トレース (例: を使用して ex.printStackTrace()
表示) が含まれます。最小限は後者のみです。
ブロックする可能性がある ForkJoinTasks を定義して使用することもできますが、これを行うには、さらに 3 つの考慮事項が必要です。(1) 他<の em/em> タスクが外部同期または I/O をブロックするタスクに依存する必要がある場合<>は、いくつかの完了が必要です。 参加しないイベント スタイルの非同期タスク (サブクラス化 CountedCompleter
など) は、多くの場合、このカテゴリに分類されます。 (2) リソースへの影響を最小限に抑えるには、タスクを小さくする必要があります。理想的には、(場合によっては) ブロックアクションのみを実行します。 (3) API が使用されている場合、またはブロックされている可能性のあるタスクの数がプールのForkJoinPool#getParallelism
レベルより少ないことがわかっている場合を除きForkJoinPool.ManagedBlocker
、プールは、進行状況または良好なパフォーマンスを確保するために十分なスレッドが使用可能であることを保証できません。
タスクの完了を待機して結果を抽出するための主な方法は です #join
。ただし、いくつかのバリエーションがあります。メソッドは Future#get
、中断可能な待機や時間指定された待機をサポートし、規則を使用して結果を Future
報告します。 メソッド #invoke
は意味的には と fork(); join()
同等ですが、常に現在のスレッドで実行を開始しようとします。 これらのメソッドの "<em>quiet</em>" 形式では、結果を抽出したり、例外を報告したりすることはありません。 これらは、一連のタスクが実行されていて、すべてが完了するまで結果または例外の処理を遅らせる必要がある場合に便利です。 メソッド invokeAll
(複数のバージョンで使用可能) は、最も一般的な形式の並列呼び出しを実行します。一連のタスクをフォークし、それらをすべて結合します。
最も一般的な使用法では、フォーク結合ペアは、並列再帰関数からの呼び出し (フォーク) と戻り (結合) のように動作します。 他の形式の再帰呼び出しの場合と同様に、戻り値 (結合) は最も内側から順に実行する必要があります。 たとえば、 a.fork(); b.fork(); b.join(); a.join();
は、 の前b
に結合a
するよりも実質的に効率的である可能性があります。
タスクの実行状態は、いくつかの詳細 #isDone
レベルで照会される可能性があります。 は、タスクが何らかの方法で完了した場合 (タスクが実行されずに取り消された場合を含む) #isCompletedNormally
の場合は true です。キャンセルなしでタスクが完了した場合、または例外 #isCancelled
が発生した場合は true です。タスクが取り消された場合は true (この場合 #getException
は が CancellationException
返されます) #isCompletedAbnormally
、タスクが取り消されたか例外が発生した場合は true です。 この場合 #getException
、発生した例外または CancellationException
が返されます。
通常、ForkJoinTask クラスは直接サブクラス化されません。 代わりに、フォーク/結合処理の特定のスタイルをサポートする抽象クラスの 1 つをサブクラス化します。通常 RecursiveAction
は、結果を返さないほとんどの計算、実行する計算、 RecursiveTask
完了 CountedCompleter
したアクションが他のアクションをトリガーする計算の場合です。 通常、具象 ForkJoinTask サブクラスは、コンストラクターで確立されたパラメーターを含むフィールドを宣言し、この基底クラスによって提供される制御メソッドを何らかの方法で使用するメソッドを定義 compute
します。
メソッド #join
とそのバリアントは、完了依存関係が非循環である場合にのみ使用に適しています。つまり、並列計算は有向非循環グラフ (DAG) として記述できます。 そうしないと、タスクが互いに繰り返し待機するため、実行でデッドロックの形式が発生する可能性があります。 ただし、このフレームワークでは、DAG として静的に構造化されていない問題に対してカスタム サブクラスを構築する際に使用できる他のメソッドと#complete
手法 (、、 の使用などPhaser
#helpQuiesce
) がサポートされています。 このような使用をサポートするために、ForkJoinTask は を使用して値を持つshort
タグ付け/<em> をアトミックに <em>し、 を使用#setForkJoinTaskTag
#compareAndSetForkJoinTaskTag
して#getForkJoinTaskTag
チェックできます。 ForkJoinTask 実装では、これらの protected
メソッドまたはタグは任意の目的で使用されませんが、特殊なサブクラスの構築で使用される可能性があります。 たとえば、並列グラフ トラバーサルでは、指定されたメソッドを使用して、既に処理されているノード/タスクを再検討しないようにすることができます。 (タグ付けのメソッド名は、その使用パターンを反映するメソッドの定義を促進するために、一部が大きいので、
基になる軽量タスク スケジューリング フレームワークに本質的に関連付けられている実装のオーバーライドを防ぐために、ほとんどの基本サポート メソッドは final
です。 フォーク/結合処理の新しい基本的なスタイルを作成する開発者は、メソッド #exec
、、#setRawResult
および #getRawResult
を最小限に抑protected
えながら、サブクラスに実装できる抽象計算メソッドも導入する必要があります。このクラスによって提供される他protected
のメソッドに依存している可能性があります。
ForkJoinTasks では、比較的少量の計算を実行する必要があります。 大きなタスクは、通常は再帰分解によって、より小さなサブタスクに分割する必要があります。 非常に大まかな経験則として、タスクは 100 を超え、1,0000 未満の基本的な計算ステップを実行する必要があり、不定ループを回避する必要があります。 タスクが大きすぎる場合、並列処理でスループットを向上させることはできません。 小さすぎると、メモリと内部タスクのメンテナンスのオーバーヘッドによって処理が過負荷になる可能性があります。
このクラスは、 および のRunnable
メソッドを提供adapt
しますCallable
。これは、 の実行ForkJoinTasks
を他の種類のタスクと混合するときに使用できます。 すべてのタスクがこの形式の場合は、em asyncMode</em で構築されたプールの<使用を検討してください>。>
ForkJoinTasks は Serializable
であり、リモート実行フレームワークなどの拡張機能で使用できます。 タスクのシリアル化は、実行中ではなく、前または後にのみ行うのが賢明です。 シリアル化は、実行中に依存しません。
1.7 で追加されました。
の Java ドキュメント java.util.concurrent.ForkJoinTask
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
ForkJoinTask() |
呼び出すサブクラスのコンストラクター。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
Exception |
基本計算によってスローされた例外を返します |
ForkJoinTaskTag |
このタスクのタグを返します。 |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
IsCancelled |
このタスクが |
IsCompletedAbnormally |
このタスクが例外を |
IsCompletedNormally |
このタスクが例外を |
IsDone |
このタスクが完了した場合は を |
JniIdentityHashCode |
内で |
JniPeerMembers |
内で |
PeerReference |
内で |
Pool |
現在のスレッドをホストしているプールを返します。または |
QueuedTaskCount |
現在のワーカー スレッドによってフォークされたが、まだ実行されていないタスクの数の推定値を返します。 |
RawRawResult |
によって返される Join()結果を返します。このタスクが異常に完了した場合や |
SurplusQueuedTaskCount |
現在のワーカー スレッドによって保持されているローカルキュータスクの数を、他のワーカー スレッドよりも多く盗む可能性がある数の推定値を返します。このスレッドが ForkJoinPool で動作していない場合は 0 を返します。 |
ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
メソッド
Adapt(ICallable) |
指定した の |
Adapt(IRunnable) |
指定 |
Adapt(IRunnable, Object) |
指定した のメソッドを |
Cancel(Boolean) |
このタスクの実行を取り消そうとします。 |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
このタスクのタグ値をアトミックに条件付きで設定します。 |
Complete(Object) |
このタスクを完了し、まだ中止または取り消されていない場合は、後続の および 関連する操作の呼び出しの結果として、指定された値を |
CompleteExceptionally(Throwable) |
このタスクを異常に完了し、まだ中止または取り消されていない場合は、指定された例外と関連する操作を |
Dispose() |
内で |
Dispose(Boolean) |
内で |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
Exec() |
このタスクの基本アクションを直ちに実行し、このメソッドから戻った時点でこのタスクが完了することが保証されている場合は true を返します。 |
Fork() |
現在のタスクが実行されているプールでこのタスクを非同期に実行するように配置します(該当する場合は )。 そうでない |
Get() |
計算が完了するまで必要に応じて 待機し、その結果を取得します。 |
Get(Int64, TimeUnit) |
計算が完了するまで、必要に応じて最大で指定された時間待機し、その結果 (使用可能な場合) を取得します。 |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
HelpQuiesce() |
現在のタスク ForkJoinPool#isQuiescent をホストしているプールが休止するまで、タスクを実行する場合があります。 |
InForkJoinPool() |
現在の |
Invoke() |
このタスクの実行を開始し、必要に応じて完了を待機し、その結果を返すか、 (オフ) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
特定のタスクをフォークし、各タスクの保留または |
InvokeAll(ForkJoinTask[]) |
指定したコレクション内のすべてのタスクをフォークし、各タスクの保留または |
InvokeAll(ICollection) |
指定したコレクション内のすべてのタスクをフォークし、各タスクの保留または |
JavaFinalize() |
ガベージ コレクションがオブジェクトへの参照がなくなったと判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Join() |
計算が完了したときに計算の結果 #isDone 返します。 |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドをウェイクアップします。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドをウェイクアップします。 (継承元 Object) |
PeekNextLocalTask() |
現在のスレッドによってキューに入れられたが、まだ実行されていないタスクをすぐに使用できる場合は、スケジュールを解除または実行しませんが、返します。 |
PollNextLocalTask() |
現在のスレッドが ForkJoinPool で動作している場合は、現在のスレッドによってキューに入れられ、まだ実行されていない次のタスクを実行せずにスケジュールを解除して返します。 |
PollTask() |
現在のスレッドが ForkJoinPool で動作している場合は、スケジュールを解除し、実行せずに、現在のスレッドによってキューに入れられましたが、まだ実行されていない次のタスク (使用可能な場合)、または使用できない場合は、他のスレッドによってフォークされたタスク (使用可能な場合) を返します。 |
QuietlyComplete() |
値を設定せずにこのタスクを正常に完了します。 |
QuietlyInvoke() |
このタスクの実行を開始し、結果を返したり例外をスローしたりすることなく、必要に応じて完了を待機します。 |
QuietlyJoin() |
結果を返したり、例外をスローしたりせずに、このタスクを結合します。 |
Reinitialize() |
このタスクの内部簿記状態をリセットし、後続 |
SetForkJoinTaskTag(Int16) |
このタスクのタグ値をアトミックに設定し、古い値を返します。 |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
SetRawResult(Object) |
指定した値を強制的に結果として返します。 |
ToArray<T>() |
内で |
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
TryUnfork() |
このタスクの実行スケジュール解除を試みます。 |
UnregisterFromRuntime() |
内で |
Wait() |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または <em>割り込み</em によって待機します>。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
内で |
IJavaPeerable.DisposeUnlessReferenced() |
内で |
IJavaPeerable.Finalized() |
内で |
IJavaPeerable.JniManagedPeerState |
内で |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
内で |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
内で |
IJavaPeerable.SetPeerReference(JniObjectReference) |
内で |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
内で |
GetJniTypeName(IJavaPeerable) |
内で |
GetAsync(IFuture) |
内で |
GetAsync(IFuture, Int64, TimeUnit) |
内で |