Freigeben über


ForkJoinTask Klasse

Definition

Abstrakte Basisklasse für Aufgaben, die in einem 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
Vererbung
ForkJoinTask
Abgeleitet
Attribute
Implementiert

Hinweise

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool. A ForkJoinTask ist eine threadähnliche Entität, die viel leichter als ein normaler Thread ist. Große Anzahl von Vorgängen und Teilvorgängen kann von einer kleinen Anzahl tatsächlicher Threads in einem ForkJoinPool gehostet werden, zum Preis einiger Nutzungseinschränkungen.

Ein "Main" ForkJoinTask beginnt die Ausführung, wenn sie explizit an eine ForkJoinPoolOder, wenn sie noch nicht an eine ForkJoin-Berechnung beteiligt ist, in der ForkJoinPool#commonPool() Via #fork, #invokeoder verwandten Methoden begonnen wird. Nach dem Starten beginnt er in der Regel mit anderen Teilvorgängen. Wie durch den Namen dieser Klasse angegeben, verwenden viele Programme ForkJoinTask nur Methoden #fork und #join, oder Ableitungen wie #invokeAll(ForkJoinTask...) invokeAll. Diese Klasse bietet jedoch auch eine Reihe anderer Methoden, die bei erweiterten Verwendungen ins Spiel kommen können, sowie Erweiterungsmechaniken, die die Unterstützung neuer Formen der Verzweigung/Verknüpfungsverarbeitung ermöglichen.

A ForkJoinTask ist eine einfache Form von Future. Die Effizienz von ForkJoinTasks ergibt sich aus einer Reihe von Einschränkungen (die nur teilweise erzwingbar sind), die ihren Haupteinsatz als Rechenaufgaben widerspiegeln, die reine Funktionen berechnen oder auf rein isolierten Objekten arbeiten. Die primären Koordinationsmechanismen sind #fork, die die asynchrone Ausführung anordnen und #join, die erst fortgesetzt werden, wenn das Ergebnis der Aufgabe berechnet wurde. Berechnungen sollten im Idealfall Methoden oder Blöcke vermeiden und andere Blockieren der Synchronisierung abgesehen von der Verknüpfung anderer Aufgaben oder der Verwendung von Synchronizern wie Phasers minimieren synchronized , die für die Zusammenarbeit mit der Verzweigungs-/Verknüpfungsplanung angekündigt werden. Unterteilende Aufgaben sollten auch keine Blockierung von E/A ausführen und sollten idealerweise auf Variablen zugreifen, die vollständig unabhängig von denen sind, auf die von anderen ausgeführten Aufgaben zugegriffen wird. Diese Richtlinien werden lose erzwungen, indem überprüfte Ausnahmen wie IOExceptions das Auslösen von überprüften Ausnahmen nicht zulässig sind. Berechnungen können jedoch weiterhin auf deaktivierte Ausnahmen stoßen, die anrufern, die versuchen, ihnen beizutreten. Diese Ausnahmen können auch aus RejectedExecutionException der internen Ressourcenausschöpfung stammen, z. B. fehler beim Zuordnen interner Aufgabenwarteschlangen. Erneutes Auslösen von Ausnahmen verhält sich auf die gleiche Weise wie normale Ausnahmen, enthalten aber, wenn möglich, Stapelüberwachungen (wie z. B. die Verwendung ex.printStackTrace()von ) des Threads, der die Berechnung initiiert hat, sowie den Thread, der tatsächlich auf die Ausnahme trifft; minimal nur letztere.

Es ist möglich, ForkJoinTasks zu definieren und zu verwenden, die blockiert werden können. Dies erfordert jedoch drei weitere Überlegungen: (1) Abschluss von wenigen, wenn andere<></em-Vorgänge> von einer Aufgabe abhängig sein sollten, die für die externe Synchronisierung oder E/A blockiert wird. Asynchrone Aufgaben im Ereignisstil, die nie verknüpft sind (z. B. diese Unterklassen CountedCompleter), fallen häufig in diese Kategorie. (2) Um die Ressourcenbelastung zu minimieren, sollten Die Vorgänge klein sein; Idealerweise wird nur die (möglicherweise) blockierende Aktion ausgeführt. (3) Sofern die ForkJoinPool.ManagedBlocker API nicht verwendet wird oder die Anzahl der möglicherweise blockierten Aufgaben kleiner als die Ebene des ForkJoinPool#getParallelism Pools ist, kann der Pool nicht garantieren, dass genügend Threads verfügbar sind, um den Fortschritt oder eine gute Leistung sicherzustellen.

Die primäre Methode für das Warten auf den Abschluss und das Extrahieren von Ergebnissen eines Vorgangs ist #join, aber es gibt mehrere Varianten: Die Future#get Methoden unterstützen unterbrechungsfähige und/oder zeitlich festgelegte Wartezeiten für den Abschluss und Melden von Ergebnissen mithilfe von Future Konventionen. Die Methode #invoke ist semantisch gleichbedeutend mit fork(); join() der Ausführung im aktuellen Thread, aber immer versucht, die Ausführung im aktuellen Thread zu beginnen. Die "<em>quiet</em>"-Formulare dieser Methoden extrahieren keine Ergebnisse oder melden Ausnahmen. Dies kann nützlich sein, wenn eine Reihe von Aufgaben ausgeführt wird, und Sie müssen die Verarbeitung von Ergebnissen oder Ausnahmen verzögern, bis alle abgeschlossen sind. Die Methode invokeAll (in mehreren Versionen verfügbar) führt die am häufigsten verwendete Form des parallelen Aufrufs durch: Verwendung einer Gruppe von Aufgaben und Verknüpfen aller Vorgänge.

In den am häufigsten verwendeten Verwendungen fungiert ein Verzweigungspaar wie ein Aufruf (Verzweigung) und gibt (Verknüpfung) aus einer parallelen rekursiven Funktion zurück. Wie bei anderen Formen rekursiver Aufrufe sollten Rückgaben (Verknüpfungen) am innersten ausgeführt werden. Zum Beispiel a.fork(); b.fork(); b.join(); a.join(); ist wahrscheinlich wesentlich effizienter als der Beitritt a vor b.

Der Ausführungsstatus von Vorgängen kann auf mehreren Detailebenen abgefragt werden: #isDone ist "true", wenn eine Aufgabe in irgendeiner Weise abgeschlossen wurde (einschließlich des Falls, in dem ein Vorgang abgebrochen wurde, ohne auszuführen), #isCompletedNormally "true", wenn eine Aufgabe ohne Abbruch abgeschlossen wurde oder eine Ausnahme auftritt; #isCancelled ist "true", wenn die Aufgabe abgebrochen wurde (in diesem Fall #getException wird ein CancellationExceptionFehler zurückgegeben). Wenn #isCompletedAbnormally eine Aufgabe entweder abgebrochen oder eine Ausnahme aufgetreten ist, in diesem Fall #getException wird entweder die aufgetretene Ausnahme oder CancellationException.

Die ForkJoinTask-Klasse ist in der Regel nicht direkt unterklasseniert. Stattdessen unterklassen Sie eine der abstrakten Klassen, die eine bestimmte Formatvorlage für Diek-/Verknüpfungsverarbeitung unterstützen, in der Regel RecursiveAction für die meisten Berechnungen, die keine Ergebnisse zurückgeben, für diejenigen, RecursiveTask die dies tun, und CountedCompleter für diejenigen, in denen abgeschlossene Aktionen andere Aktionen auslösen. Normalerweise deklariert eine konkrete ForkJoinTask-Unterklasse Felder, die ihre Parameter umfassen, die in einem Konstruktor eingerichtet sind, und definiert dann eine compute Methode, die irgendwie die von dieser Basisklasse bereitgestellten Steuerelementmethoden verwendet.

Die Methode #join und die zugehörigen Varianten sind nur dann geeignet, wenn Vervollständigungsabhängigkeiten azyklische Sind. Das heißt, die parallele Berechnung kann als gerichtetes azyklisches Diagramm (DAG) beschrieben werden. Andernfalls kann eine Form des Deadlocks auftreten, da Aufgaben zyklisch aufeinander warten. Dieses Framework unterstützt jedoch andere Methoden und Techniken (z. B. die Verwendung von Phaser, #helpQuiesceund #complete), die bei der Erstellung von benutzerdefinierten Unterklassen für Probleme verwendet werden können, die nicht statisch als DAGs strukturiert sind. Zur Unterstützung solcher Verwendungen kann ein ForkJoinTask atomisch <mit einem Wert markiert</em> sein>, der einen short Wert verwendet #setForkJoinTaskTag oder #compareAndSetForkJoinTaskTag überprüft#getForkJoinTaskTag. Die ForkJoinTask-Implementierung verwendet diese protected Methoden oder Tags nicht zu irgendeinem Zweck, aber sie können bei der Konstruktion spezieller Unterklassen verwendet werden. Beispielsweise können parallele Diagramm-Traversale die bereitgestellten Methoden verwenden, um das Überarbeiten von Knoten/Aufgaben zu vermeiden, die bereits verarbeitet wurden. (Methodennamen für tagging sind teilweise massenhaft, um die Definition von Methoden zu fördern, die ihre Verwendungsmuster widerspiegeln.)

Die meisten Basisunterstützungsmethoden sind final, um zu verhindern, dass Implementierungen überschrieben werden, die systemintern mit dem zugrunde liegenden Framework für die Einfache Vorgangsplanung verknüpft sind. Entwickler, die neue grundlegende Stile für die Freihand-/Verknüpfungsverarbeitung erstellen, sollten minimal Methoden #exec#setRawResultimplementieren protected und #getRawResultgleichzeitig eine abstrakte Berechnungsmethode einführen, die in ihren Unterklassen implementiert werden kann, möglicherweise auf andere protected Methoden, die von dieser Klasse bereitgestellt werden.

ForkJoinTasks sollte relativ kleine Berechnungen durchführen. Große Vorgänge sollten in kleinere Teilvorgänge aufgeteilt werden, in der Regel über rekursive Dekomposition. Als sehr grobe Faustregel sollte ein Vorgang mehr als 100 und weniger als 10000 grundlegende Rechenschritte ausführen und eine unbestimmte Schleife vermeiden. Wenn Vorgänge zu groß sind, kann der Durchsatz nicht verbessert werden. Wenn zu klein, kann der Arbeitsspeicher und der interne Wartungsaufwand die Verarbeitung überwältigen.

Diese Klasse bietet adapt Methoden für Runnable und Callable, die beim Mischen der Ausführung mit ForkJoinTasks anderen Arten von Aufgaben verwendet werden können. Wenn alle Aufgaben dieses Formulars sind, sollten Sie einen pool verwenden, der in <em>asyncMode</em> erstellt wurde.

ForkJoinTasks sind Serializable, wodurch sie in Erweiterungen wie Remoteausführungsframeworks verwendet werden können. Es ist sinnvoll, Aufgaben nur vor oder nach der Ausführung zu serialisieren, aber nicht während der Ausführung. Die Serialisierung wird während der Ausführung selbst nicht verwendet.

In 1.7 hinzugefügt.

Java-Dokumentation für java.util.concurrent.ForkJoinTask.

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Konstruktoren

ForkJoinTask()

Konstruktor für Unterklassen, die aufgerufen werden sollen.

ForkJoinTask(IntPtr, JniHandleOwnership)

Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Laufzeit aufgerufen.

Eigenschaften

Class

Gibt die Laufzeitklasse dieses Werts Objectzurück.

(Geerbt von Object)
Exception

Gibt die Ausnahme zurück, die von der Basisberechnung ausgelöst wird, oder wenn CancellationException dies abgebrochen wurde, oder null wenn keine oder wenn die Methode noch nicht abgeschlossen wurde.

ForkJoinTaskTag

Gibt das Tag für diesen Vorgang zurück.

Handle

Das Handle für die zugrunde liegende Android-Instanz.

(Geerbt von Object)
IsCancelled

Gibt zurück true , ob diese Aufgabe abgebrochen wurde, bevor sie normal abgeschlossen wurde.

IsCompletedAbnormally

Gibt zurück true , wenn diese Aufgabe eine Ausnahme ausgelöst oder abgebrochen wurde.

IsCompletedNormally

Gibt zurück true , wenn diese Aufgabe abgeschlossen wurde, ohne eine Ausnahme zu auslösen und nicht abgebrochen wurde.

IsDone

Gibt zurück true , wenn diese Aufgabe abgeschlossen wurde.

JniIdentityHashCode

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
JniPeerMembers

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

PeerReference

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
Pool

Gibt den Pool zurück, der den aktuellen Thread hosten soll oder null wenn der aktuelle Thread außerhalb eines ForkJoinPool ausgeführt wird.

QueuedTaskCount

Gibt eine Schätzung der Anzahl der Vorgänge zurück, die vom aktuellen Arbeitsthread verzweigt, aber noch nicht ausgeführt wurden.

RawRawResult

Gibt das Ergebnis zurück, das von Join(), auch wenn diese Aufgabe nicht ungewöhnlich abgeschlossen wurde, oder null wenn diese Aufgabe nicht abgeschlossen wurde.

SurplusQueuedTaskCount

Gibt eine Schätzung zurück, wie viele mehr lokal in die Warteschlange eingereihte Aufgaben vom aktuellen Arbeitsthread gehalten werden, als andere Arbeitsthreads vorhanden sind, die sie stehlen könnten, oder null, wenn dieser Thread nicht in einem ForkJoinPool ausgeführt wird.

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

Adapt(ICallable)

Gibt eine neue ForkJoinTask , die die call Methode der angegebenen Callable Aktion ausführt, und gibt das Ergebnis zurück, wenn #joinalle eingecheckten Ausnahmen übersetzt werden RuntimeException.

Adapt(IRunnable)

Gibt eine neueForkJoinTask, die die run Methode der angegebenen Runnable Aktion ausführt, und gibt ein NULL-Ergebnis zurück.#join

Adapt(IRunnable, Object)

Gibt eine neueForkJoinTask, die die run Methode der angegebenen Runnable Aktion ausführt, und gibt das angegebene Ergebnis zurück.#join

Cancel(Boolean)

Versucht, die Ausführung dieser Aufgabe abzubrechen.

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.

Complete(Object)

Führt diese Aufgabe aus, und wenn sie nicht bereits abgebrochen oder abgebrochen wurde, wird der angegebene Wert als Ergebnis nachfolgender Aufrufe join und verwandter Vorgänge zurückgegeben.

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 join und verwandte Vorgänge aus.

Dispose()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
Dispose(Boolean)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
Equals(Object)

Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist.

(Geerbt von Object)
Exec()

Führt sofort die Basisaktion dieses Vorgangs aus und gibt true zurück, wenn diese Aufgabe garantiert abgeschlossen ist, wenn diese Methode zurückgegeben wird.

Fork()

Ordnet die asynchrone Ausführung dieser Aufgabe im Pool an, in der die aktuelle Aufgabe ausgeführt wird( falls zutreffend) oder wenn ForkJoinPool#commonPool() dies nicht #inForkJoinPoolder Fall ist.

Get()

Wartet, falls erforderlich, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab.

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.

GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
HelpQuiesce()

Führt möglicherweise Aufgaben aus, bis der Pool, der die aktuelle Aufgabe ForkJoinPool#isQuiescent hostet, stillgelegt ist.

InForkJoinPool()

Gibt zurück true , wenn der aktuelle Thread eine ForkJoinWorkerThread Ausführung als ForkJoinPool-Berechnung ist.

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) RuntimeException oder Error wenn die zugrunde liegende Berechnung dies getan hat.

InvokeAll(ForkJoinTask, ForkJoinTask)

Gibt die angegebenen Vorgänge zurück, wenn haltebereiche isDone für jeden Vorgang oder eine (deaktivierte) Ausnahme gefunden werden, in diesem Fall wird die Ausnahme erneut ausgelöst.

InvokeAll(ForkJoinTask[])

Schränkt alle Vorgänge in der angegebenen Auflistung ein, und gibt an, wann isDone haltebereiche für jeden Vorgang oder eine (deaktivierte) Ausnahme gefunden werden, in diesem Fall wird die Ausnahme erneut ausgelöst.

InvokeAll(ICollection)

Schränkt alle Vorgänge in der angegebenen Auflistung ein, und gibt an, wann isDone haltebereiche für jeden Vorgang oder eine (deaktivierte) Ausnahme gefunden werden, in diesem Fall wird die Ausnahme erneut ausgelöst.

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.

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)
PeekNextLocalTask()

Gibt, aber nicht geplant oder ausgeführt, eine Aufgabe, die vom aktuellen Thread in die Warteschlange gestellt, aber noch nicht ausgeführt wird, wenn eine sofort verfügbar ist.

PollNextLocalTask()

Entplant und gibt ohne Ausführung die nächste Aufgabe, die vom aktuellen Thread in die Warteschlange gestellt, aber noch nicht ausgeführt wird, wenn der aktuelle Thread in einem ForkJoinPool ausgeführt wird.

PollTask()

Wenn der aktuelle Thread in einem ForkJoinPool ausgeführt wird, entplant und gibt die nächste Aufgabe, die vom aktuellen Thread in die Warteschlange gestellt wird, aber noch nicht ausgeführt wird, sofern vorhanden oder nicht verfügbar, eine Aufgabe, die von einem anderen Thread gezweigt wurde, falls verfügbar.

QuietlyComplete()

Schließt diesen Vorgang normal ab, ohne einen Wert festzulegen.

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.

QuietlyJoin()

Verknüpft diese Aufgabe, ohne das Ergebnis zurückzugeben oder die Ausnahme zu auslösen.

Reinitialize()

Setzt den internen Buchführungszustand dieser Aufgabe zurück, sodass eine nachfolgende fork.

SetForkJoinTaskTag(Int16)

Atomar legt den Tagwert für diesen Vorgang fest und gibt den alten Wert zurück.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetRawResult(Object)

Erzwingt, dass der angegebene Wert als Ergebnis zurückgegeben wird.

ToArray<T>()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(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.

UnregisterFromRuntime()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(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)

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, 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)

Explizite Schnittstellenimplementierungen

IJavaPeerable.Disposed()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.Finalized()

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

(Geerbt von Object)

Erweiterungsmethoden

JavaCast<TResult>(IJavaObject)

Führt eine android-laufzeitgecheckte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

GetJniTypeName(IJavaPeerable)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

GetAsync(IFuture)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

GetAsync(IFuture, Int64, TimeUnit)

Abstrakte Basisklasse für Aufgaben, die in einem ForkJoinPool.

Gilt für: