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
実行されるタスクの抽象基本クラス。 A ForkJoinTask
はスレッドに似たエンティティであり、通常のスレッドよりもはるかに軽量です。 膨大な数のタスクとサブタスクは、いくつかの使用制限の代わりに、ForkJoinPool 内の少数の実際のスレッドによってホストされる可能性があります。
"main" ForkJoinTask
は、明示的に送信されたときに実行をForkJoinPool
開始します。または、ForkJoin 計算にまだ関与していない場合は、via #fork
#invoke
メソッド、または関連メソッドでForkJoinPool#commonPool()
開始されます。 一度開始すると、通常は他のサブタスクが開始されます。 このクラスの名前で示されているように、多くのプログラムはメソッド#fork
および#join
、または派生物#invokeAll(ForkJoinTask...) invokeAll
のみを使用ForkJoinTask
します。 ただし、このクラスには、高度な使用法で使用できる他のメソッドや、新しい形式のフォーク/結合処理のサポートを可能にする拡張メカニズムも用意されています。
A ForkJoinTask
は軽量の形式です Future
。 s の効率は、純粋関数を 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
レベルで照会できます。タスクが何らかの方法で完了した場合 (タスクが実行されずに取り消された場合を含む) は true です #isCompletedNormally
。取り消しまたは例外が発生せずにタスクが完了した場合は true です #isCancelled
。タスクが取り消された場合 (その場合 #getException
は返 CancellationException
されます) #isCompletedAbnormally
、タスクが取り消されたか例外が発生した場合は true です。 この場合 #getException
、発生した例外または CancellationException
.
通常、ForkJoinTask クラスは直接サブクラス化されません。 代わりに、特定のスタイルのフォーク/結合処理をサポートする抽象クラスの 1 つをサブクラス化します。通常 RecursiveAction
、結果を返さないほとんどの計算、実行する計算、 RecursiveTask
完了 CountedCompleter
したアクションが他のアクションをトリガーする計算の場合です。 通常、具象 ForkJoinTask サブクラスは、コンストラクターで確立されたパラメーターで構成されるフィールドを宣言し、この基底クラスによって提供される制御メソッドを何らかの方法で使用するメソッドを定義 compute
します。
メソッド #join
とそのバリアントは、完了依存関係が非循環である場合にのみ使用できます。つまり、並列計算は有向非環式グラフ (DAG) として記述できます。 そうしないと、タスクが互いを繰り返し待機する際に、実行でデッドロックが発生する可能性があります。 ただし、このフレームワークでは、DAG として静的に構造化されていない問題に対してカスタム サブクラスを構築する際に使用できるその他のメソッドと#complete
手法 (例: Phaser
、#helpQuiesce
、) がサポートされています。 このような使用法をサポートするために、ForkJoinTask は、値を使用してアトミックに<>タグ付け/em>short
を<行うか、または#compareAndSetForkJoinTaskTag
使用して#setForkJoinTaskTag
#getForkJoinTaskTag
チェックすることができます。 ForkJoinTask の実装では、これらの protected
メソッドまたはタグは任意の目的で使用されませんが、特殊化されたサブクラスの構築で使用される場合があります。 たとえば、並列グラフ トラバーサルでは、指定されたメソッドを使用して、既に処理されているノード/タスクの再検討を回避できます。 (タグ付けのメソッド名の一部は、使用パターンを反映するメソッドの定義を促進するために大き目になります)。
ほとんどの基本サポート メソッドは、 final
基になる軽量タスク スケジューリング フレームワークに本質的に関連付けられている実装のオーバーライドを防ぐためです。 フォーク/結合処理の新しい基本的なスタイルを作成する開発者は、メソッド#exec
を#setRawResult
最小限にprotected
抑#getRawResult
え、サブクラスに実装できる抽象計算メソッドも導入する必要があります。このクラスによって提供される他protected
のメソッドに依存している可能性があります。
ForkJoinTasks は、比較的少量の計算を実行する必要があります。 大規模なタスクは、通常は再帰的分解を使用して、より小さなサブタスクに分割する必要があります。 非常に大まかな経験則として、タスクは 100 以上 1,0000 未満の基本的な計算ステップを実行し、無限ループを回避する必要があります。 タスクが大きすぎる場合、並列処理でスループットを向上させることはできません。 小さすぎると、メモリと内部タスクのメンテナンスのオーバーヘッドによって処理が過剰になる可能性があります。
このクラスは、他の種類のタスクと実行ForkJoinTasks
を混在させる場合に使用できるメソッドとCallable
、そのメソッドRunnable
を提供adapt
します。 すべてのタスクがこの形式の場合は、em>asyncMode/em> で構築されたプールの<使用を<検討してください。
ForkJoinTasks は Serializable
、リモート実行フレームワークなどの拡張機能で使用できるようにします。 タスクをシリアル化するのは、実行中の前後にのみ有効ですが、実行中はシリアル化できません。 シリアル化は、実行中に依存しません。
1.7 で追加されました。
の Java ドキュメントjava.util.concurrent.ForkJoinTask
このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
ForkJoinTask() |
呼び出すサブクラスのコンストラクター。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
Exception |
基本計算によってスローされた例外、または |
ForkJoinTaskTag |
このタスクのタグを返します。 |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
IsCancelled |
このタスクが |
IsCompletedAbnormally |
このタスクが |
IsCompletedNormally |
このタスクが例外を |
IsDone |
このタスクが |
JniIdentityHashCode |
内で |
JniPeerMembers |
内で |
PeerReference |
内で |
Pool |
現在のスレッドをホストしているプール、または |
QueuedTaskCount |
現在のワーカー スレッドによってフォークされたが、まだ実行されていないタスクの数の見積もりを返します。 |
RawRawResult |
このタスクが異常に完了した場合、または |
SurplusQueuedTaskCount |
現在のワーカー スレッドによって保持されているローカルにキューに登録されたタスクの数の推定値を返します。このスレッドが ForkJoinPool で動作していない場合は、他のワーカー スレッドよりも多く保持されます。 |
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) |
内で |