RecursiveAction Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ein rekursives Ergebnislos 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
- Vererbung
- Attribute
Hinweise
Ein rekursives Ergebnislos ForkJoinTask. Diese Klasse legt Konventionen fest, um ergebnislose Aktionen als VoidForkJoinTasks zu parametrisieren. Da null es sich um den einzigen gültigen Wert vom Typ Voidhandelt, geben Methoden wie join immer nach Abschluss zurück null .
<b>Beispielverwendungen.</b> Hier ist eine einfache, aber vollständige ForkJoin-Sortierung, die ein bestimmtes long[] Array sortiert:
{@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++];
}
}}
Sie können dann sortieren anArray , indem Sie es in einem ForkJoinPool erstellen new SortTask(anArray) und aufrufen. Im konkreteren einfachen Beispiel erhöht die folgende Aufgabe jedes Element eines Arrays:
{@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));
}
}
}}
Im folgenden Beispiel werden einige Verfeinerungen und Didiome veranschaulicht, die zu einer besseren Leistung führen können: RecursiveActions müssen nicht vollständig rekursiv sein, solange sie den grundlegenden Divid-and-Conquer-Ansatz beibehalten. Hier ist eine Klasse, die die Quadrate jedes Elements eines doppelten Arrays addiert, indem nur die rechten Seiten wiederholter Divisionen nach zwei unterteilt und mit einer Kette von next Bezügen nachverfolgt werden. Es verwendet einen dynamischen Schwellenwert basierend auf der Methode getSurplusQueuedTaskCount, aber ausgleicht potenzielle übermäßige Partitionierung durch direktes Ausführen von Blattaktionen für nicht getolente Vorgänge anstatt weiter unterteilen.
{@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;
}
}}
In 1.7 hinzugefügt.
Java-Dokumentation für java.util.concurrent.RecursiveAction.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
| Name | Beschreibung |
|---|---|
| RecursiveAction() |
Konstruktor für Unterklassen, die aufgerufen werden sollen. |
| RecursiveAction(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Laufzeit aufgerufen. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Class |
Gibt die Laufzeitklasse dieses Werts |
| Exception |
Gibt die Ausnahme zurück, die von der Basisberechnung ausgelöst wird, oder wenn |
| ForkJoinTaskTag |
Gibt das Tag für diesen Vorgang zurück. (Geerbt von ForkJoinTask) |
| Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
| IsCancelled |
Gibt zurück |
| IsCompletedAbnormally |
Gibt zurück |
| IsCompletedNormally |
Gibt zurück |
| IsDone |
Gibt zurück |
| JniIdentityHashCode |
Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist. (Geerbt von Object) |
| JniManagedPeerState |
Ein rekursives Ergebnislos |
| JniPeerMembers |
Ein rekursives Ergebnislos |
| PeerReference |
Ruft den JNI-Objektverweis für diesen Java Peer ab. (Geerbt von Object) |
| RawRawResult |
Gibt das Ergebnis zurück, das von Join(), auch wenn diese Aufgabe nicht ungewöhnlich abgeschlossen wurde, oder |
| ThresholdClass |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
| ThresholdType |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
Methoden
| Name | Beschreibung |
|---|---|
| Cancel(Boolean) |
Versucht, die Ausführung dieser Aufgabe abzubrechen. (Geerbt von ForkJoinTask) |
| Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
Atomar bedingt legt den Tagwert für diese Aufgabe fest. (Geerbt von ForkJoinTask) |
| Complete(Object) |
Führt diese Aufgabe aus, und wenn sie nicht bereits abgebrochen oder abgebrochen wurde, wird der angegebene Wert als Ergebnis nachfolgender Aufrufe |
| CompleteExceptionally(Throwable) |
Führt diese Aufgabe nicht ungewöhnlich aus, und wenn sie nicht bereits abgebrochen oder abgebrochen wurde, löst sie die gegebene Ausnahme auf |
| Compute() |
Die Hauptberechnung, die von dieser Aufgabe ausgeführt wird. |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Ein rekursives Ergebnislos |
| Dispose() |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| Dispose(Boolean) |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| DisposeUnlessReferenced() |
Ein rekursives Ergebnislos |
| Equals(Object) |
Ein rekursives Ergebnislos |
| Equals(Object) |
Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist. (Geerbt von Object) |
| ExceptionNow() |
Ein rekursives Ergebnislos |
| Exec() |
Implementiert Ausführungskonventionen für RecursiveActions. |
| Fork() |
Ordnet die asynchrone Ausführung dieser Aufgabe im Pool an, in der die aktuelle Aufgabe ausgeführt wird( falls zutreffend) oder wenn |
| Get() |
Wartet, falls erforderlich, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab. (Geerbt von ForkJoinTask) |
| Get(Int64, TimeUnit) |
Wartet, falls erforderlich, bis die Berechnung abgeschlossen ist, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab, falls verfügbar. (Geerbt von ForkJoinTask) |
| GetHashCode() |
Gibt einen Hashcodewert für das Objekt zurück. (Geerbt von Object) |
| Invoke() |
Beginnt mit der Ausführung dieses Vorgangs, wartet bei Bedarf auf seinen Abschluss und gibt sein Ergebnis zurück oder löst eine (nicht überprüfte) |
| JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind. (Geerbt von Object) |
| Join() |
Gibt das Ergebnis der Berechnung zurück, wenn #isDone abgeschlossen ist. (Geerbt von ForkJoinTask) |
| Notify() |
Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet. (Geerbt von Object) |
| NotifyAll() |
Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten. (Geerbt von Object) |
| QuietlyComplete() |
Schließt diesen Vorgang normal ab, ohne einen Wert festzulegen. (Geerbt von ForkJoinTask) |
| QuietlyInvoke() |
Beginnt mit der Durchführung dieser Aufgabe und wartet bei Bedarf auf den Abschluss, ohne dass das Ergebnis zurückgegeben oder die Ausnahme ausgelöst wird. (Geerbt von ForkJoinTask) |
| QuietlyJoin() |
Verknüpft diese Aufgabe, ohne das Ergebnis zurückzugeben oder die Ausnahme zu auslösen. (Geerbt von ForkJoinTask) |
| QuietlyJoin(Int64, TimeUnit) |
Versucht, diese Aufgabe zu verbinden, und gibt "true" zurück, wenn sie vor dem angegebenen Timeout (möglicherweise ausnahmsweise) abgeschlossen wurde und der aktuelle Thread nicht unterbrochen wurde. (Geerbt von ForkJoinTask) |
| QuietlyJoinUninterruptibly(Int64, TimeUnit) |
Versucht, diese Aufgabe zu verbinden, und gibt "true" zurück, wenn sie vor dem angegebenen Timeout abgeschlossen wurde (möglicherweise ausnahmsweise). (Geerbt von ForkJoinTask) |
| Reinitialize() |
Setzt den internen Buchführungszustand dieser Aufgabe zurück, sodass eine nachfolgende |
| ResultNow() |
Ein rekursives Ergebnislos |
| SetForkJoinTaskTag(Int16) |
Atomar legt den Tagwert für diesen Vorgang fest und gibt den alten Wert zurück. (Geerbt von ForkJoinTask) |
| SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Ein rekursives Ergebnislos |
| SetRawResult(Object) |
Erzwingt, dass der angegebene Wert als Ergebnis zurückgegeben wird. (Geerbt von ForkJoinTask) |
| State() |
Ein rekursives Ergebnislos |
| ToArray<T>() |
Erstellt ein verwaltetes Array aus diesem Java Arraywrapper. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
| TryUnfork() |
Versucht, diese Aufgabe für die Ausführung zu entplanen. (Geerbt von ForkJoinTask) |
| UnregisterFromRuntime() |
Hebt die Registrierung dieses Java Peers aus der Interop-Laufzeit auf. (Geerbt von Object) |
| Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em< oder >em<unterbrochen>/em<.><> (Geerbt von Object) |
| Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
| Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| IJavaPeerable.Disposed() |
Ein rekursives Ergebnislos |
| IJavaPeerable.Finalized() |
Ein rekursives Ergebnislos |
| IJavaPeerable.JniObjectReferenceControlBlock |
Ein rekursives Ergebnislos |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Ein rekursives Ergebnislos |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Ein rekursives Ergebnislos |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Ein rekursives Ergebnislos |
| IJavaPeerable.UnregisterFromRuntime() |
Ein rekursives Ergebnislos |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| GetAsync(IFuture, Int64, TimeUnit) |
Ein rekursives Ergebnislos |
| GetAsync(IFuture) |
Ein rekursives Ergebnislos |
| GetJniTypeName(IJavaPeerable) |
Ruft den JNI-Namen des Typs der Instanz |
| JavaAs<TResult>(IJavaPeerable) |
Versuchen Sie, die Eingabe |
| JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
| JavaCast<TResult>(IJavaObject) |
Ein rekursives Ergebnislos |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Versuchen Sie, die Eingabe |