Heim  >  Artikel  >  Java  >  So wenden Sie die CyclicBarrier-Zyklusbarriere in Java an

So wenden Sie die CyclicBarrier-Zyklusbarriere in Java an

WBOY
WBOYnach vorne
2023-05-12 14:19:181131Durchsuche

1. Einführung

CyclicBarrier bedeutet wörtlich „Schleifenbarriere“ (zyklische Barriere). Sie kann eine Gruppe von Threads auf einen bestimmten Zustand (Barrierepunkt) warten lassen und sie dann alle gleichzeitig ausführen. Es wird Loopback genannt, da CyclicBarrier wiederverwendet werden kann, nachdem alle wartenden Threads freigegeben wurden.

So wenden Sie die CyclicBarrier-Zyklusbarriere in Java an

Die Funktion von CyclicBarrier besteht darin, eine Gruppe von Threads aufeinander warten zu lassen. Wenn ein gemeinsamer Punkt erreicht ist, werden alle zuvor wartenden Threads weiterhin ausgeführt und die CyclicBarrier-Funktion kann wiederverwendet werden. 2. Verwendung von CyclicBarrier Wird für die Multithread-Berechnung von Daten und schließlich für die Zusammenführung verwendet die Berechnungsergebnisse.

Nutzen Sie die Funktionen von CyclicBarrier, sodass der Zähler zurückgesetzt und die Barriere wiederverwendet werden kann, was ähnliche Szenarien wie „Der Zug ist voller Menschen“ unterstützen kann.

Simulieren Sie zusammengeführte Berechnungsszenarien.

Verwenden Sie CyclicBarrier zum Berechnen Daten in mehreren Threads und schließlich Szenarien zum Zusammenführen von Berechnungsergebnissen.

 // parties表示屏障拦截的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然后当前线程被阻塞。
 public CyclicBarrier(int parties)
 // 用于在线程到达屏障时,优先执行 barrierAction,方便处理更复杂的业务场景(该线程的执行时机是在到达屏障之后再执行)
Simulieren Sie die Szene „Der Zug ist voller Menschen“

Mit den Funktionen von CyclicBarrier, mit denen der Zähler zurückgesetzt und die Barriere wiederverwendet werden kann, kann die Szene „Der Zug ist voller Menschen“ unterstützt werden

//屏障 指定数量的线程全部调用await()方法时,这些线程不再阻塞
// BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时
public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
//循环  通过reset()方法可以进行重置
  • Ausgabeergebnis:

  • 3 Spieler Nr. 1 ist in Position, bereit zum Teilen: 78 ms 0

    1 Spieler ist in Position, bereit zum Teilen: 395 ms 1

    5 Spieler ist in Position, bereit zum Teilen: 733 ms 2
  • 2 Spieler ist in Position, bereit zum Teilen: 776 ms3
Spieler Nr. 4 ist in Position, bereit zum Teilen: 807 ms4

Schiedsrichter: Das Spiel hat begonnen~~

Spieler Nr. 4 ist in Position, bereit zum Teilen: 131 ms0

Spieler Nr. 3 ist an Ort und Stelle, bereit zum Teilen: 256 ms1

Spieler Nr. 2 ist bereits an Ort und Stelle, bereit zum Teilen: 291 ms2

Spieler Nr. 1 ist an Ort und Stelle, bereit zum Teilen: 588 ms3

Spieler Nr. 5 ist an Ort und Stelle , bereit zum Teilen: 763ms4

Schiedsrichter: Das Spiel hat begonnen~~

3. CyclicBarrier-Quellcode-Analyse

CyclicBarrier-Prozess


Der Hauptprozess ist:




Holen Sie sich die Sperre und geben Sie die Blockierung ein, wenn Sie zählen! = 0;



Vor dem Eintritt in die Blockierung müssen Sie zuerst die Bedingungswarteschlange betreten, dann die Sperre aufheben und schließlich blockieren Warteschlange wird in Blockierungswarteschlangen umgewandelt;

Nach dem Aufwecken wird die Sperre erworben. Wenn die Sperre fehlschlägt, wird sie in die Blockierungswarteschlange der Sperre aufgenommen Die Sperre wird aufgehoben und die Threads in der Synchronisationswarteschlange werden aktiviert.

Das Folgende ist ein einfaches Flussdiagramm:

  • Das Folgende ist der spezifische Prozess einiger Codeaufrufe:
  • Ein paar häufige Fragen?

  • 1. Eine Gruppe von Threads wartet aufeinander, bevor sie die Barriere auslöst. Wie wird die Wecklogik implementiert, nachdem der letzte Thread die Barriere erreicht hat? Up-Bedingungswarteschlange.

  • 2. Wie wird der Spaltenlöschzyklus implementiert? Tatsächlich werden die Bedingungswarteschlange und die Blockierungswarteschlange eines Mutex-ReentrantLocks konvertiert.

3. Implementierungslogik der Konvertierung von der Bedingungswarteschlange in die Synchronisationswarteschlange? die Synchronisationswarteschlange.

Der Unterschied zwischen CyclicBarrier und CountDownLatchSo wenden Sie die CyclicBarrier-Zyklusbarriere in Java an

Der Zähler von CountDownLatch kann nur einmal verwendet werden, während der Zähler von CyclicBarrier mit der Methode reset() zurückgesetzt werden kann. Daher kann CyclicBarrier komplexere Geschäftsszenarien verarbeiten. Wenn beispielsweise ein Berechnungsfehler auftritt, kann CyclicBarrier auch getNumberWaiting (um die Anzahl der von CyclicBarrier blockierten Threads zu erhalten) bereitstellen (um herauszufinden, ob der blockierte Thread unterbrochen wurde) und andere Methoden.

So wenden Sie die CyclicBarrier-Zyklusbarriere in Java anCountDownLatch blockiert den Hauptthread, CyclicBarrier blockiert nicht den Hauptthread, sondern nur den untergeordneten Thread.

    CountDownLatch und CyclicBarrier können beide das Warten zwischen Threads implementieren, haben jedoch unterschiedliche Schwerpunkte. CountDownLatch wird im Allgemeinen verwendet, damit ein oder mehrere Threads darauf warten, dass andere Threads ihre Aufgaben abschließen, bevor sie sie ausführen. CyclicBarrier wird im Allgemeinen verwendet, damit eine Gruppe von Threads darauf wartet, dass der andere einen bestimmten Zustand erreicht, und die Gruppe von Threads dann gleichzeitig ausgeführt wird.
  • java.util.concurrent.locks.Condition#signalAll

    CyclicBarrier kann auch eine BarrierAction bereitstellen, um Multithread-Berechnungsergebnisse zusammenzuführen.
  • CyclicBarrier implementiert das Blockieren und Erwachen einer Gruppe von Threads durch die „exklusive Sperre“ und Conditon von ReentrantLock, während CountDownLatch durch die „gemeinsame Sperre“ von AQS implementiert wird

Das obige ist der detaillierte Inhalt vonSo wenden Sie die CyclicBarrier-Zyklusbarriere in Java an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen