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