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.
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.
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,方便处理更复杂的业务场景(该线程的执行时机是在到达屏障之后再执行)
//屏障 指定数量的线程全部调用await()方法时,这些线程不再阻塞 // BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时 public int await() throws InterruptedException, BrokenBarrierException public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException //循环 通过reset()方法可以进行重置
1 Spieler ist in Position, bereit zum Teilen: 395 ms 1
5 Spieler ist in Position, bereit zum Teilen: 733 ms 2Spieler 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 ms2Schiedsrichter: 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;
Das Folgende ist ein einfaches Flussdiagramm:
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 CountDownLatch
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.
CountDownLatch blockiert den Hauptthread, CyclicBarrier blockiert nicht den Hauptthread, sondern nur den untergeordneten Thread.
java.util.concurrent.locks.Condition#signalAll
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!