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
ausgeführt werden.
[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
ausgeführt werden. A ForkJoinTask
ist eine threadähnliche Entität, die viel weniger Gewicht hat als ein normaler Thread. Eine große Anzahl von Aufgaben und Untertasks kann von einer kleinen Anzahl tatsächlicher Threads in einem ForkJoinPool gehostet werden, zum Preis einiger Nutzungseinschränkungen.
Eine "Standard" ForkJoinTask
beginnt mit der Ausführung, wenn sie explizit an eine ForkJoinPool
- oder , falls nicht bereits an einer ForkJoin-Berechnung beteiligt ist, in der ForkJoinPool#commonPool()
über #fork
, #invoke
oder verwandten Methoden begonnen wird. Nach dem Start werden in der Regel wiederum andere Teilaufgaben gestartet. Wie der Name dieser Klasse angibt, verwenden viele Programme, die ForkJoinTask
nur Methoden #fork
und #join
verwenden, oder Derivate 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 Fork-/Joinverarbeitung 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 statisch erzwingbar sind), die ihre Standard Verwendung als Rechenaufgaben zum Berechnen von reinen Funktionen oder zum Arbeiten an rein isolierten Objekten widerspiegeln. Die primären Koordinierungsmechanismen sind #fork
, die die asynchrone Ausführung anordnen, und #join
, die erst fortgesetzt wird, wenn das Ergebnis der Aufgabe berechnet wurde. Berechnungen sollten im Idealfall Methoden oder Blöcke vermeiden synchronized
und andere blockierende Synchronisierungen außer dem Verknüpfen anderer Aufgaben oder der Verwendung von Synchronisierungen wie Phasern minimieren, die für die Zusammenarbeit mit der Fork-/Joinplanung angekündigt werden. Unterteilte Aufgaben sollten auch keine blockierenden E/A-Vorgänge ausführen und im Idealfall auf Variablen zugreifen, die völlig unabhängig von denen sind, auf die von anderen ausgeführten Aufgaben zugegriffen wird. Diese Richtlinien werden lose erzwungen, indem nicht zugelassen wird, dass überprüfte Ausnahmen wie IOExceptions
ausgelöst werden. Bei Berechnungen treten jedoch möglicherweise weiterhin ungeprüfte Ausnahmen auf, die für Aufrufer, die versuchen, sie zu verbinden, erneut ausgeführt werden. Zu diesen Ausnahmen kann auch die Ausschöpfung interner Ressourcen gehören RejectedExecutionException
, z. B. fehler beim Zuweisen interner Aufgabenwarteschlangen. Rethrown-Ausnahmen verhalten sich auf die gleiche Weise wie reguläre Ausnahmen, enthalten aber nach Möglichkeit Stapelablaufverfolgungen (wie z. B. mit ex.printStackTrace()
) des Threads, der die Berechnung initiiert hat, sowie des Threads, der tatsächlich auf die Ausnahme stößt; minimal nur letzteres.
Es ist möglich, ForkJoinTasks zu definieren und zu verwenden, die möglicherweise blockieren, aber dies erfordert drei weitere Überlegungen: (1) Die Vervollständigung weniger, wenn andere<></em-Aufgaben> von einer Aufgabe abhängig sein sollten, die die externe Synchronisierung oder E/A blockiert. Asynchrone Aufgaben im Ereignisstil, die nie verknüpft sind (z. B. diese Unterklassen CountedCompleter
), fallen häufig in diese Kategorie. (2) Um die Auswirkungen auf die Ressourcen zu minimieren, sollten die Aufgaben klein sein; idealerweise nur die (möglicherweise) blockierende Aktion ausführen. (3) Sofern die ForkJoinPool.ManagedBlocker
API nicht verwendet wird oder die Anzahl der möglicherweise blockierten Aufgaben als kleiner als die ForkJoinPool#getParallelism
Poolebene bekannt 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 zum Warten auf den Abschluss und das Extrahieren der Ergebnisse eines Vorgangs ist #join
, aber es gibt mehrere Varianten: Die Future#get
Methoden unterstützen unterbrechbare und/oder zeitliche Wartezeiten auf die Vervollständigung und melden Ergebnisse mithilfe von Future
Konventionen. Die Methode #invoke
ist semantisch gleichwertig fork(); join()
, versucht jedoch immer, mit der Ausführung im aktuellen Thread zu beginnen. Die "<em>quiet</em"->Formen dieser Methoden extrahieren keine Ergebnisse oder Berichtsausnahmen. Diese können 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 aus: Eine Reihe von Aufgaben zu forkingen und alle zusammenzufügen.
In den meisten typischen Verwendungen verhält sich ein Fork-Join-Paar wie ein Aufruf (Fork) und gibt (Join) von einer parallel rekursiven Funktion zurück. Wie bei anderen Formen rekursiver Aufrufe sollten Rückgaben (Joins) in erster Linie ausgeführt werden. a.fork(); b.fork(); b.join(); a.join();
Beispielsweise ist wahrscheinlich wesentlich effizienter als das Verknüpfen a
vor b
.
Die Ausführung status von Vorgängen kann auf mehreren Detailebenen abgefragt werden: #isDone
ist true, wenn eine Aufgabe in irgendeiner Weise abgeschlossen wurde (einschließlich des Falles, in dem eine Aufgabe abgebrochen wurde, ohne auszuführen), #isCompletedNormally
ist true, wenn eine Aufgabe ohne Abbruch abgeschlossen wurde oder eine Ausnahme auftritt; #isCancelled
ist true, wenn der Vorgang abgebrochen wurde (in diesem Fall #getException
gibt einen CancellationException
zurück) und #isCompletedAbnormally
true ist, wenn eine Aufgabe entweder abgebrochen wurde oder eine Ausnahme aufgetreten ist. in diesem Fall #getException
wird entweder die gefundene Ausnahme oder zurückgegebenCancellationException
.
Die ForkJoinTask-Klasse wird normalerweise nicht direkt unterklassiert. Stattdessen unterklassen Sie eine der abstrakten Klassen, die einen bestimmten Stil der Fork-/Joinverarbeitung 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.
Methode #join
und ihre Varianten eignen sich nur für die Verwendung, wenn Vervollständigungsabhängigkeiten acyclisch sind. Das heißt, die parallele Berechnung kann als gerichteter azyklischer Graph (DAG) beschrieben werden. Andernfalls können Ausführungen auf eine Art Deadlock stoßen, da Aufgaben zyklisch aufeinander warten. Dieses Framework unterstützt jedoch andere Methoden und Techniken (z. B. die Verwendung von Phaser
, #helpQuiesce
und #complete
), die beim Erstellen benutzerdefinierter Unterklassen für Probleme von Nutzen sein können, die nicht statisch als DAGs strukturiert sind. Um solche Verwendungen zu unterstützen, kann ein ForkJoinTask atomar <em>tagged</em> mit einem short
Wert mit #setForkJoinTaskTag
oder #compareAndSetForkJoinTaskTag
versehen und mit #getForkJoinTaskTag
überprüft werden. Die ForkJoinTask-Implementierung verwendet diese protected
Methoden oder Tags nicht für irgendeinen Zweck, aber sie können bei der Konstruktion spezialisierter Unterklassen von Nutzen sein. Beispielsweise können parallele Graphdurchläufe die angegebenen Methoden verwenden, um zu vermeiden, dass bereits verarbeitete Knoten/Aufgaben erneut verwendet werden. (Methodennamen für das Tagging sind teilweise massenhaft, um die Definition von Methoden zu fördern, die ihre Nutzungsmuster widerspiegeln.)
Die meisten Basisunterstützungsmethoden sind final
, um das Überschreiben von Implementierungen zu verhindern, die intrinsisch mit dem zugrunde liegenden Lightweight-Taskplanungsframework verknüpft sind. Entwickler, die neue grundlegende Stile der Fork-/Joinverarbeitung erstellen, sollten die Methoden #exec
, und minimal implementieren protected
und #getRawResult
gleichzeitig eine abstrakte Berechnungsmethode einführen, die in ihren Unterklassen implementiert werden kann und möglicherweise auf anderen protected
Von dieser Klasse bereitgestellten Methoden #setRawResult
basiert.
ForkJoinTasks sollte relativ kleine Berechnungen durchführen. Große Aufgaben sollten in kleinere Teilaufgaben unterteilt werden, in der Regel durch rekursive Zerlegung. Als grobe Faustregel sollte eine Aufgabe mehr als 100 und weniger als 10.000 grundlegende Rechenschritte ausführen und unbegrenzte Schleifen vermeiden. Wenn Aufgaben zu groß sind, kann Parallelität den Durchsatz nicht verbessern. Wenn sie zu klein ist, kann der Aufwand für die Arbeitsspeicher- und interne Aufgabenwartung die Verarbeitung überlasten.
Diese Klasse stellt Methoden für Runnable
und Callable
bereitadapt
, die beim Mischen der Ausführung von ForkJoinTasks
mit anderen Arten von Aufgaben hilfreich sein können. Wenn alle Aufgaben diese Form haben, sollten Sie einen Pool verwenden, der in <em>asyncMode</em> erstellt wurde.
ForkJoinTasks sind Serializable
, sodass sie in Erweiterungen wie Remoteausführungsframeworks verwendet werden können. Es ist sinnvoll, Aufgaben nur vor oder nach der Ausführung, aber nicht während der Ausführung zu serialisieren. Die Serialisierung wird während der Ausführung selbst nicht verwendet.
In Version 1.7 hinzugefügt.
Java-Dokumentation für java.util.concurrent.ForkJoinTask
.
Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In der Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
ForkJoinTask() |
Konstruktor für zu aufrufende Unterklassen. |
ForkJoinTask(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Runtime aufgerufen. |
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses |
Exception |
Gibt die Ausnahme zurück, die von der Basisberechnung ausgelöst wird, oder eine |
ForkJoinTaskTag |
Gibt das Tag für diese Aufgabe zurück. |
Handle |
Das Handle zum zugrunde liegenden Android-instance. (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 hostt, oder |
QueuedTaskCount |
Gibt eine Schätzung der Anzahl von Aufgaben zurück, die vom aktuellen Workerthread gespalten, aber noch nicht ausgeführt wurden. |
RawRawResult |
Gibt das Ergebnis zurück, das von Join()zurückgegeben wird, auch wenn diese Aufgabe nicht ordnungsgemäß abgeschlossen wurde oder |
SurplusQueuedTaskCount |
Gibt eine Schätzung zurück, wie viele weitere lokal in die Warteschlange eingereihte Aufgaben vom aktuellen Workerthread gehalten werden, als es andere Workerthreads gibt, 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 ein neues |
Adapt(IRunnable) |
Gibt ein neues |
Adapt(IRunnable, Object) |
Gibt ein neues |
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) |
Legt den Tagwert für diese Aufgabe atomar bedingt fest. |
Complete(Object) |
Schließt diese Aufgabe ab, und wenn nicht bereits abgebrochen oder abgebrochen, wird der angegebene Wert als Ergebnis nachfolgender Aufrufe von |
CompleteExceptionally(Throwable) |
Führt diese Aufgabe ungewöhnlich aus, und wenn sie nicht bereits abgebrochen oder abgebrochen wurde, führt sie dazu, dass die angegebene Ausnahme für |
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 diesem "gleich" ist. (Geerbt von Object) |
Exec() |
Führt sofort die Basisaktion dieser Aufgabe aus und gibt true zurück, wenn bei der Rückgabe von dieser Methode garantiert ist, dass diese Aufgabe abgeschlossen ist. |
Fork() |
Arrangiert, um diese Aufgabe asynchron im Pool auszuführen, in dem der aktuelle Task ausgeführt wird, falls zutreffend, oder verwendet, |
Get() |
Wartet bei Bedarf, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab. |
Get(Int64, TimeUnit) |
Wartet bei Bedarf bis maximal die angegebene Zeit, 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() |
Möglicherweise werden Aufgaben ausgeführt, bis der Pool, der die aktuelle Aufgabe ForkJoinPool#isQuiescent hostet, ruhen kann. |
InForkJoinPool() |
Gibt zurück |
Invoke() |
Beginnt mit der Ausführung dieser Aufgabe, wartet bei Bedarf auf dessen Abschluss und gibt das Ergebnis zurück, oder löst ein (ungeprüft) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Forks für die angegebenen Aufgaben, die zurückgegeben werden, wenn |
InvokeAll(ForkJoinTask[]) |
Gibt alle Aufgaben in der angegebenen Auflistung ab, und gibt zurück, wenn |
InvokeAll(ICollection) |
Gibt alle Aufgaben in der angegebenen Auflistung ab, und gibt zurück, wenn |
JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr 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 eine Aufgabe zurück, die vom aktuellen Thread in die Warteschlange gestellt, aber noch nicht ausgeführt wird, wenn sie sofort verfügbar ist. |
PollNextLocalTask() |
Entplant und gibt die nächste Aufgabe, die vom aktuellen Thread in die Warteschlange gestellt, aber noch nicht ausgeführt wird, ohne auszuführen, zurück, wenn der aktuelle Thread in einem ForkJoinPool ausgeführt wird. |
PollTask() |
Wenn der aktuelle Thread in einem ForkJoinPool ausgeführt wird, wird die nächste Aufgabe, die vom aktuellen Thread in die Warteschlange gestellt, aber noch nicht ausgeführt wird, nicht geplant und zurückgegeben, wenn eine aufgabe verfügbar ist, oder, falls nicht verfügbar, eine Aufgabe, die von einem anderen Thread gezweigt wurde, falls verfügbar. |
QuietlyComplete() |
Schließt diese Aufgabe normal ab, ohne einen Wert festzulegen. |
QuietlyInvoke() |
Beginnt mit der Ausführung dieser Aufgabe und wartet bei Bedarf auf dessen Abschluss, ohne das Ergebnis zurückzugeben oder die Ausnahme auszulösen. |
QuietlyJoin() |
Verknüpft diese Aufgabe, ohne dass das Ergebnis zurückgegeben oder die Ausnahme ausgelöst wird. |
Reinitialize() |
Setzt den internen Buchhaltungsstatus dieser Aufgabe zurück, sodass ein nachfolgendes |
SetForkJoinTaskTag(Int16) |
Legt atomar den Tagwert für diese Aufgabe 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, diesen Task für die Ausführung auf den Plan zu stellen. |
UnregisterFromRuntime() |
Abstrakte Basisklasse für Aufgaben, die in einem |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel durch em benachrichtigen/em> oder <em>interrupted</em>.<>< (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</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 Für Android-Runtime überprüfte 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 |