ForkJoinTask 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.
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
- 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 ForkJoinPool
Oder, wenn sie noch nicht an eine ForkJoin-Berechnung beteiligt ist, in der ForkJoinPool#commonPool()
Via #fork
, #invoke
oder 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 ForkJoinTask
s 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 CancellationException
Fehler 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
, #helpQuiesce
und #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
#setRawResult
implementieren protected
und #getRawResult
gleichzeitig 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 |
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. |
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 |
Abstrakte Basisklasse für Aufgaben, die in einem |
JniPeerMembers |
Abstrakte Basisklasse für Aufgaben, die in einem |
PeerReference |
Abstrakte Basisklasse für Aufgaben, die in einem |
Pool |
Gibt den Pool zurück, der den aktuellen Thread hosten soll oder |
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 |
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 |
Adapt(IRunnable) |
Gibt eine neue |
Adapt(IRunnable, Object) |
Gibt eine neue |
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 |
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 |
Dispose() |
Abstrakte Basisklasse für Aufgaben, die in einem |
Dispose(Boolean) |
Abstrakte Basisklasse für Aufgaben, die in einem |
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 |
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 |
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) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Gibt die angegebenen Vorgänge zurück, wenn haltebereiche |
InvokeAll(ForkJoinTask[]) |
Schränkt alle Vorgänge in der angegebenen Auflistung ein, und gibt an, wann |
InvokeAll(ICollection) |
Schränkt alle Vorgänge in der angegebenen Auflistung ein, und gibt an, wann |
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 |
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 |
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 |
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 |
IJavaPeerable.DisposeUnlessReferenced() |
Abstrakte Basisklasse für Aufgaben, die in einem |
IJavaPeerable.Finalized() |
Abstrakte Basisklasse für Aufgaben, die in einem |
IJavaPeerable.JniManagedPeerState |
Abstrakte Basisklasse für Aufgaben, die in einem |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Abstrakte Basisklasse für Aufgaben, die in einem |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Abstrakte Basisklasse für Aufgaben, die in einem |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Abstrakte Basisklasse für Aufgaben, die in einem |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
JavaCast<TResult>(IJavaObject) |
Abstrakte Basisklasse für Aufgaben, die in einem |
GetJniTypeName(IJavaPeerable) |
Abstrakte Basisklasse für Aufgaben, die in einem |
GetAsync(IFuture) |
Abstrakte Basisklasse für Aufgaben, die in einem |
GetAsync(IFuture, Int64, TimeUnit) |
Abstrakte Basisklasse für Aufgaben, die in einem |