Freigeben über


Phaser Klasse

Definition

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

[Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)]
public class Phaser : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)>]
type Phaser = class
    inherit Object
Vererbung
Phaser
Attribute

Hinweise

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

<b>Registrierung.</b> Im Gegensatz zu anderen Hindernissen kann die Anzahl der Beteiligten<><>, die auf einem Phaser synchronisiert werden sollen, im Laufe der Zeit variieren. Aufgaben können jederzeit registriert werden (unter Verwendung von Methoden #register, #bulkRegisteroder Formen von Konstruktoren, die erste Anzahl von Parteien einrichten), und optional bei Ankunft (unter Verwendung #arriveAndDeregister) deregistert werden. Wie bei den meisten grundlegenden Synchronisierungskonstrukten wirken sich Registrierung und Registrierung nur auf interne Zählungen aus; sie richten keine weiteren internen Buchführungen ein, sodass Aufgaben nicht abfragen können, ob sie registriert sind. (Sie können diese Buchführung jedoch durch Unterklassen dieser Klasse einführen.)

<b>Synchronisierung.</b> Wie a CyclicBarrier, eine Phaser kann wiederholt erwartet werden. Die Methode #arriveAndAwaitAdvance hat analog zu java.util.concurrent.CyclicBarrier#await CyclicBarrier.await. Jede Generation eines Phasers weist eine zugeordnete Phasennummer auf. Die Phasennummer beginnt bei Null und wechselt, wenn alle Parteien am Phaser ankommen und nach erreichen Integer.MAX_VALUEbis null umgebrochen werden. Die Verwendung von Phasennummern ermöglicht eine unabhängige Kontrolle der Aktionen bei der Ankunft in einem Phaser und auf das Warten anderer, über zwei Arten von Methoden, die von jeder registrierten Partei aufgerufen werden können:

<ul>

<li><b>Ankunft.</b> Methoden #arrive und #arriveAndDeregister Aufzeichnen der Ankunft. Diese Methoden blockieren nicht, sondern geben eine zugeordnete <Em-Ankunftsphase>zahl</em> zurück, d. h. die Phasennummer des Phasengebers, auf den die Ankunft angewendet wurde. Wenn die endgültige Partei für eine bestimmte Phase eingeht, wird eine optionale Aktion ausgeführt, und die Phase wird vorangestellt. Diese Aktionen werden von der Partei ausgeführt, die einen Phasenvorschuss auslöst, und werden durch überschreibende Methode #onAdvance(int, int)angeordnet, die auch die Beendigung steuert. Das Überschreiben dieser Methode ist ähnlich, aber flexibler als die Bereitstellung einer Barriereaktion für eine CyclicBarrier.

<li><b>Warten.</b> -Methode #awaitAdvance erfordert ein Argument, das eine Ankunftsphasesnummer angibt, und gibt zurück, wenn der Phaser zu einer anderen Phase wechselt (oder bereits vorhanden ist). Im Gegensatz zu ähnlichen Konstruktionen, die verwendet CyclicBarrierwerden, wartet die Methode awaitAdvance weiterhin, auch wenn der Wartethread unterbrochen wird. Unterbrechungsfähige Versionen und Timeoutversionen sind ebenfalls verfügbar, aber Ausnahmen, die auftreten, während Aufgaben unterbrechlich warten oder mit Timeout den Zustand des Phasers nicht ändern. Bei Bedarf können Sie eine beliebige zugeordnete Wiederherstellung innerhalb von Handlern dieser Ausnahmen ausführen, häufig nach dem Aufrufen forceTermination. Phasen können auch von Aufgaben verwendet werden, die in einer ForkJoinPool. Der Fortschritt wird sichergestellt, wenn die Parallelitätsebene des Pools die maximale Anzahl gleichzeitig blockierter Parteien aufnehmen kann.

</ul>

<b>Kündigung.</b> Ein Phaser kann einen <Em-Beendigungs><-/Em-Zustand> eingeben, der mithilfe der Methode #isTerminatedüberprüft werden kann. Nach Beendigung werden alle Synchronisierungsmethoden sofort zurückgegeben, ohne auf voraus zu warten, wie durch einen negativen Rückgabewert angegeben. Ebenso haben Versuche, sich bei Kündigung anzumelden, keine Auswirkung. Die Beendigung wird ausgelöst, wenn ein Aufruf der onAdvance Rückgaben trueausgelöst wird. Die Standardimplementierung gibt zurück true , wenn eine Registrierung dazu geführt hat, dass die Anzahl der registrierten Parteien null wurde. Wie unten dargestellt, ist es häufig praktisch, diese Methode außer Kraft zu setzen, wenn phasenweise Aktionen mit einer festen Anzahl von Iterationen gesteuert werden, um eine Beendigung zu verursachen, wenn die aktuelle Phasesnummer einen Schwellenwert erreicht. Die Methode #forceTermination steht auch zur abrupten Freigabe von Wartethreads und zum Beenden zur Verfügung.

<b>Tiering.</b> Phasers können auf ebenerebene</em>> (d. h. in Strukturstrukturen konstruiert) sein<, um die Konstruierung zu reduzieren. Phasen mit einer großen Anzahl von Parteien, die andernfalls zu hohen Synchronisierungskonfliktkosten führen würden, können stattdessen so eingerichtet werden, dass Gruppen von Unterphasengebern ein gemeinsames übergeordnetes Element teilen. Dies kann den Durchsatz erheblich erhöhen, auch wenn ein größerer Aufwand pro Vorgang entsteht.

In einer Struktur mit mehrstufigen Phasen werden registrierung und Registrierung von untergeordneten Phasenrn mit ihrem übergeordneten Element automatisch verwaltet. Wenn die Anzahl der registrierten Parteien eines untergeordneten Phasers ungleich Null wird (wie im #Phaser(Phaser,int) Konstruktor #registerfestgelegt, oder #bulkRegister), wird der untergeordnete Phaser mit seinem übergeordneten Element registriert. Wenn die Anzahl der registrierten Parteien als Ergebnis eines Aufrufs null #arriveAndDeregisterwird, wird der untergeordnete Phaser von seinem übergeordneten Element abgemeldet.

<b>Überwachung.</b> Während Synchronisierungsmethoden nur von registrierten Parteien aufgerufen werden können, kann der aktuelle Zustand eines Phasers von jedem Aufrufer überwacht werden. Zu einem bestimmten Zeitpunkt gibt #getRegisteredParties es insgesamt Parteien, von denen #getArrivedParties die aktuelle Phase (#getPhase) erreicht ist. Wenn die übrigen (#getUnarrivedParties) Parteien ankommen, wird die Phase voran schreitet. Die von diesen Methoden zurückgegebenen Werte spiegeln möglicherweise vorübergehende Zustände wider und sind daher für die Synchronisierungskontrolle nicht allgemein nützlich. Die Methode #toString gibt Momentaufnahmen dieser Zustandsabfragen in einem Formular zurück, das für die informelle Überwachung geeignet ist.

Auswirkungen der Speicherkonsistenz: Aktionen vor jeder Form der Eintreffensmethode <i happen-before</i> a corresponding phase advance and onAdvance actions (if present), which in turn-beforeactions following the phase>advance.

<b>Beispielverwendungen:</b>

Eine Phaser kann anstelle einer CountDownLatch Aktion verwendet werden, um eine Einschussaktion zu steuern, die einer variablen Anzahl von Parteien dient. Das typische Idiom ist für die Methode, mit der sie zuerst registriert wird, und starten Sie dann alle Aktionen, und deregistern Sie dann wie folgt:

{@code
            void runTasks(List<Runnable> tasks) {
              Phaser startingGate = new Phaser(1); // "1" to register self
              // create and start threads
              for (Runnable task : tasks) {
                startingGate.register();
                new Thread(() -> {
                  startingGate.arriveAndAwaitAdvance();
                  task.run();
                }).start();
              }

              // deregister self to allow threads to proceed
              startingGate.arriveAndDeregister();
            }}

Eine Möglichkeit zum wiederholten Ausführen von Aktionen für eine bestimmte Anzahl von Iterationen besteht darin, eine Reihe von Threads außer Kraft zu setzen onAdvance:

{@code
            void startTasks(List<Runnable> tasks, int iterations) {
              Phaser phaser = new Phaser() {
                protected boolean onAdvance(int phase, int registeredParties) {
                  return phase >= iterations - 1 || registeredParties == 0;
                }
              };
              phaser.register();
              for (Runnable task : tasks) {
                phaser.register();
                new Thread(() -> {
                  do {
                    task.run();
                    phaser.arriveAndAwaitAdvance();
                  } while (!phaser.isTerminated());
                }).start();
              }
              // allow threads to proceed; don't wait for them
              phaser.arriveAndDeregister();
            }}

Wenn die Hauptaufgabe später auf die Beendigung warten muss, kann sie erneut registriert und dann eine ähnliche Schleife ausführen:

{@code
              // ...
              phaser.register();
              while (!phaser.isTerminated())
                phaser.arriveAndAwaitAdvance();}

Verwandte Konstruktionen können verwendet werden, um bestimmte Phasennummern in Kontexten zu erwarten, in denen Sie sicher sind, dass die Phase niemals umgebrochen Integer.MAX_VALUEwird. Zum Beispiel:

{@code
            void awaitPhase(Phaser phaser, int phase) {
              int p = phaser.register(); // assumes caller not already registered
              while (p < phase) {
                if (phaser.isTerminated())
                  // ... deal with unexpected termination
                else
                  p = phaser.arriveAndAwaitAdvance();
              }
              phaser.arriveAndDeregister();
            }}

Um eine Reihe von n Aufgaben mithilfe einer Struktur von Phasen zu erstellen, können Sie Code des folgenden Formulars verwenden, vorausgesetzt, eine Task-Klasse mit einem Konstruktor akzeptiert, mit dem Phaser sie beim Erstellen registriert wird. Nach Aufruf von build(new Task[n], 0, n, new Phaser()), können diese Aufgaben dann gestartet werden, z. B. durch Übermitteln an einen Pool:

{@code
            void build(Task[] tasks, int lo, int hi, Phaser ph) {
              if (hi - lo > TASKS_PER_PHASER) {
                for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
                  int j = Math.min(i + TASKS_PER_PHASER, hi);
                  build(tasks, i, j, new Phaser(ph));
                }
              } else {
                for (int i = lo; i < hi; ++i)
                  tasks[i] = new Task(ph);
                  // assumes new Task(ph) performs ph.register()
              }
            }}

Der beste Wert TASKS_PER_PHASER hängt hauptsächlich von den erwarteten Synchronisierungsraten ab. Ein Wert, der so niedrig wie vier ist, kann für extrem kleine Pro-Phasen-Vorgangsgremien (also hohe Raten) oder bis zu Hunderten für extrem große Stellen geeignet sein.

<b>Umsetzungshinweise:</b> Diese Umsetzung beschränkt die maximale Anzahl von Parteien auf 65535. Versuche, zusätzliche Parteien zu registrieren, führen zu IllegalStateException. Sie können und sollten jedoch gestaffelte Phasen erstellen, um beliebig große Teilnehmergruppen aufzunehmen.

In 1.7 hinzugefügt.

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

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

Phaser()

Erstellt einen neuen Phaser ohne anfangs registrierte Parteien, kein übergeordnetes Element und erste Phase 0.

Phaser(Int32)

Erstellt einen neuen Phaser mit der angegebenen Anzahl registrierter nicht zusammenhängender Parteien, keine übergeordneten und ersten Phasennummer 0.

Phaser(IntPtr, JniHandleOwnership)

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

Phaser(Phaser)

Entspricht #Phaser(Phaser, int) Phaser(parent, 0).

Phaser(Phaser, Int32)

Erstellt einen neuen Phaser mit dem angegebenen übergeordneten Element und der Anzahl der registrierten nicht zusammenhängenden Parteien.

Eigenschaften

ArrivedParties

Gibt die Anzahl der registrierten Parteien zurück, die zur aktuellen Phase dieses Phasers gelangt sind.

Class

Gibt die Laufzeitklasse dieses Werts Objectzurück.

(Geerbt von Object)
Handle

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

(Geerbt von Object)
IsTerminated

Gibt zurück true , ob dieser Phaser beendet wurde.

JniIdentityHashCode

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
JniPeerMembers

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

Parent

Gibt das übergeordnete Element dieses Phasers zurück oder null wenn keines.

PeerReference

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
Phase

Gibt die aktuelle Phasennummer zurück.

RegisteredParties

Gibt die Anzahl der bei diesem Phaser registrierten Parteien zurück.

Root

Gibt den Stamm-Vorgänger dieses Phasers zurück, der mit diesem Phaser identisch ist, wenn er kein übergeordnetes Element aufweist.

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.

UnarrivedParties

Gibt die Anzahl der registrierten Parteien zurück, die noch nicht in der aktuellen Phase dieses Phasers eingegangen sind.

Methoden

Arrive()

Kommt bei diesem Phaser an, ohne darauf zu warten, dass andere ankommen.

ArriveAndAwaitAdvance()

Kommt zu diesem Phaser und wartet auf andere.

ArriveAndDeregister()

Kommt zu diesem Phaser und deregistert von ihr ab, ohne darauf zu warten, dass andere ankommen.

AwaitAdvance(Int32)

Wartet auf die Phase dieses Phasers, um vom angegebenen Phasenwert zu wechseln, und gibt sofort zurück, wenn die aktuelle Phase nicht dem angegebenen Phasenwert entspricht oder dieser Phaser beendet wird.

AwaitAdvanceInterruptibly(Int32)

Wartet auf die Phase dieses Phasers, um vom angegebenen Phasenwert zu wechseln, wird ausgelöst InterruptedException , wenn beim Warten unterbrochen oder sofort zurückgegeben wird, wenn die aktuelle Phase nicht dem angegebenen Phasenwert entspricht oder dieser Phaser beendet wird.

AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit)

Wartet auf die Phase dieses Phasers, um vom angegebenen Phasenwert oder dem angegebenen Timeout zum Verstrichen zu wechseln, auszulösen InterruptedException , wenn beim Warten unterbrochen oder sofort zurückgegeben wird, wenn die aktuelle Phase nicht dem angegebenen Phasenwert entspricht oder dieser Phaser beendet wird.

BulkRegister(Int32)

Fügt dieser Phaser die angegebene Anzahl neuer nicht angehaltener Parteien hinzu.

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
Dispose()

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
Dispose(Boolean)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
Equals(Object)

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

(Geerbt von Object)
ForceTermination()

Erzwingt diesen Phaser, in den Beendigungszustand zu gelangen.

GetHashCode()

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

(Geerbt von Object)
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)
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)
OnAdvance(Int32, Int32)

Überschreibbare Methode zum Ausführen einer Aktion nach dem Vorlauf der Phase und zum Steuern des Beendens.

Register()

Fügt diesem Phaser eine neue nicht zusammenhängende Partei hinzu.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
ToArray<T>()

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

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

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.Finalized()

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

(Geerbt von Object)

Erweiterungsmethoden

JavaCast<TResult>(IJavaObject)

Führt eine android-laufzeitgecheckte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

GetJniTypeName(IJavaPeerable)

Eine wiederverwendbare Synchronisierungsbarriere, ähnlich der Funktionalität CyclicBarrier und CountDownLatch unterstützung einer flexibleren Nutzung.

Gilt für: