RecursiveAction クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
再帰的な結果なしの ForkJoinTask
。
[Android.Runtime.Register("java/util/concurrent/RecursiveAction", DoNotGenerateAcw=true)]
public abstract class RecursiveAction : Java.Util.Concurrent.ForkJoinTask
[<Android.Runtime.Register("java/util/concurrent/RecursiveAction", DoNotGenerateAcw=true)>]
type RecursiveAction = class
inherit ForkJoinTask
- 継承
- 属性
注釈
再帰的な結果なしの ForkJoinTask
。 このクラスは、結果なしのアクションを として Void
ForkJoinTask
パラメーター化する規則を確立します。 は 型Void
の唯一の有効な値であるためnull
、 などのjoin
メソッドは、完了時に常に を返しますnull
。
<b>サンプルの使用法。</b> ここでは、特定 long[]
の配列を並べ替える単純だが完全な ForkJoin 並べ替えです。
{@code
static class SortTask extends RecursiveAction {
final long[] array; final int lo, hi;
SortTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
SortTask(long[] array) { this(array, 0, array.length); }
protected void compute() {
if (hi - lo < THRESHOLD)
sortSequentially(lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(lo, mid, hi);
}
}
// implementation details follow:
static final int THRESHOLD = 1000;
void sortSequentially(int lo, int hi) {
Arrays.sort(array, lo, hi);
}
void merge(int lo, int mid, int hi) {
long[] buf = Arrays.copyOfRange(array, lo, mid);
for (int i = 0, j = lo, k = mid; i < buf.length; j++)
array[j] = (k == hi || buf[i] < array[k]) ?
buf[i++] : array[k++];
}
}}
その後、ForkJoinPool でを作成new SortTask(anArray)
して呼び出すことで並べ替えることができますanArray
。 より具体的な簡単な例として、次のタスクは配列の各要素をインクリメントします。
{@code
class IncrementTask extends RecursiveAction {
final long[] array; final int lo, hi;
IncrementTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
protected void compute() {
if (hi - lo < THRESHOLD) {
for (int i = lo; i < hi; ++i)
array[i]++;
}
else {
int mid = (lo + hi) >>> 1;
invokeAll(new IncrementTask(array, lo, mid),
new IncrementTask(array, mid, hi));
}
}
}}
次の例は、パフォーマンスの向上につながる可能性のあるいくつかの改良とイディオムを示しています。RecursiveActions は、基本的な除算と征服のアプローチを維持している限り、完全に再帰的である必要はありません。 ここでは、二重配列の各要素の二乗を合計するクラスです。繰り返される分割の右側のみを 2 つずつ分割し、参照の next
チェーンで追跡します。 メソッド getSurplusQueuedTaskCount
に基づく動的しきい値を使用しますが、さらに分割するのではなく、盗まれたタスクに対してリーフ アクションを直接実行することで、潜在的な過剰なパーティション分割を相殺します。
{@code
double sumOfSquares(ForkJoinPool pool, double[] array) {
int n = array.length;
Applyer a = new Applyer(array, 0, n, null);
pool.invoke(a);
return a.result;
}
class Applyer extends RecursiveAction {
final double[] array;
final int lo, hi;
double result;
Applyer next; // keeps track of right-hand-side tasks
Applyer(double[] array, int lo, int hi, Applyer next) {
this.array = array; this.lo = lo; this.hi = hi;
this.next = next;
}
double atLeaf(int l, int h) {
double sum = 0;
for (int i = l; i < h; ++i) // perform leftmost base step
sum += array[i] * array[i];
return sum;
}
protected void compute() {
int l = lo;
int h = hi;
Applyer right = null;
while (h - l > 1 && getSurplusQueuedTaskCount() <= 3) {
int mid = (l + h) >>> 1;
right = new Applyer(array, mid, h, right);
right.fork();
h = mid;
}
double sum = atLeaf(l, h);
while (right != null) {
if (right.tryUnfork()) // directly calculate if not stolen
sum += right.atLeaf(right.lo, right.hi);
else {
right.join();
sum += right.result;
}
right = right.next;
}
result = sum;
}
}}
1.7 で追加されました。
の Java ドキュメント java.util.concurrent.RecursiveAction
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
RecursiveAction() |
呼び出すサブクラスのコンストラクター。 |
RecursiveAction(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
Exception |
基本計算によってスローされた例外を返します |
ForkJoinTaskTag |
このタスクのタグを返します。 (継承元 ForkJoinTask) |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
IsCancelled |
このタスクが |
IsCompletedAbnormally |
このタスクが例外を |
IsCompletedNormally |
このタスクが例外を |
IsDone |
このタスクが完了した場合は を |
JniIdentityHashCode |
再帰的な結果なしの |
JniPeerMembers |
再帰的な結果なしの |
PeerReference |
再帰的な結果なしの |
RawRawResult |
によって返される Join()結果を返します。このタスクが異常に完了した場合や |
ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
メソッド
Cancel(Boolean) |
このタスクの実行を取り消そうとします。 (継承元 ForkJoinTask) |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
このタスクのタグ値をアトミックに条件付きで設定します。 (継承元 ForkJoinTask) |
Complete(Object) |
このタスクを完了し、まだ中止または取り消されていない場合は、後続の および 関連する操作の呼び出しの結果として、指定された値を |
CompleteExceptionally(Throwable) |
このタスクを異常に完了し、まだ中止または取り消されていない場合は、指定された例外と関連する操作を |
Compute() |
このタスクによって実行されるメイン計算。 |
Dispose() |
再帰的な結果なしの |
Dispose(Boolean) |
再帰的な結果なしの |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
Exec() |
RecursiveActions の実行規則を実装します。 |
Fork() |
現在のタスクが実行されているプールでこのタスクを非同期に実行するように配置します(該当する場合は )。 そうでない |
Get() |
計算が完了するまで必要に応じて 待機し、その結果を取得します。 (継承元 ForkJoinTask) |
Get(Int64, TimeUnit) |
計算が完了するまで、必要に応じて最大で指定された時間待機し、その結果 (使用可能な場合) を取得します。 (継承元 ForkJoinTask) |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
Invoke() |
このタスクの実行を開始し、必要に応じて完了を待機し、その結果を返すか、 (オフ) |
JavaFinalize() |
ガベージ コレクションがオブジェクトへの参照がなくなったと判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Join() |
計算が完了したときに計算の結果 #isDone 返します。 (継承元 ForkJoinTask) |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドをウェイクアップします。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドをウェイクアップします。 (継承元 Object) |
QuietlyComplete() |
値を設定せずにこのタスクを正常に完了します。 (継承元 ForkJoinTask) |
QuietlyInvoke() |
このタスクの実行を開始し、結果を返したり例外をスローしたりすることなく、必要に応じて完了を待機します。 (継承元 ForkJoinTask) |
QuietlyJoin() |
結果を返したり、例外をスローしたりせずに、このタスクを結合します。 (継承元 ForkJoinTask) |
Reinitialize() |
このタスクの内部簿記状態をリセットし、後続 |
SetForkJoinTaskTag(Int16) |
このタスクのタグ値をアトミックに設定し、古い値を返します。 (継承元 ForkJoinTask) |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
SetRawResult(Object) |
指定した値を強制的に結果として返します。 (継承元 ForkJoinTask) |
ToArray<T>() |
再帰的な結果なしの |
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
TryUnfork() |
このタスクの実行スケジュール解除を試みます。 (継承元 ForkJoinTask) |
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) |
再帰的な結果なしの |