Sowohl CountDownLatch als auch CyclicBarrier werden in Multithread-Umgebungen verwendet und sind beide Teil von Multithread-Umgebungen.
Laut Java Doc –
CountDownLatch – Eine Synchronisationshilfe, die es einem oder mehreren Threads ermöglicht, zu warten, bis eine Reihe von in anderen Threads ausgeführten Operationen abgeschlossen ist.
CyclicBarrier – Eine Synchronisationshilfe, die es einer Gruppe von Threads ermöglicht, darauf zu warten, dass einander einen gemeinsamen Barrierenpunkt erreichen.
Herr. Nein. | Key | CyclicBarrier | CountDownLatch |
---|---|---|---|
1 | Basic | ermöglicht die Synchronisierung einer Reihe von Threads, die alle darauf warten, dass sie einen gemeinsamen Barrierepunkt erreichen. | Eine Synchronisierungshilfe, die es einem oder mehreren Threads ermöglicht, auf den Abschluss einer Reihe von Vorgängen zu warten, die in anderen Threads ausgeführt werden. |
2 | Runnable | Es verfügt über einen Konstruktor, der ein Runnable bereitstellt. | Es gibt keinen solchen Konstruktor. | 3 | Threads/Aufgaben. | Es behält die Thread-Anzahl bei | 4.
| tr>Kann erweitert werden
Die Verwendung wird nicht empfohlen. |
Die Verwendung wird empfohlen. |
5 | |
Wenn ein Thread während des Wartens unterbrochen wird, lösen alle anderen wartenden Threads eine BrokenBarrierException aus andere Threads |
CyclicBarrier-Beispielpublic class Main { public static void main(String args[]) throws InterruptedException { ExecutorService executors = Executors.newFixedThreadPool(4); CyclicBarrier cyclicBarrier = new CyclicBarrier(5); executors.submit(new Service1(cyclicBarrier)); executors.submit(new Service1(cyclicBarrier)); executors.submit(new Service2(cyclicBarrier)); executors.submit(new Service2(cyclicBarrier)); executors.submit(new Service2(cyclicBarrier)); Thread.sleep(3000); System.out.println("Done"); } } import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class Service1 implements Runnable { CyclicBarrier cyclicBarrier; public Service1(CyclicBarrier cyclicBarrier) { super(); this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("Services1" + cyclicBarrier.getNumberWaiting()); while (true) { try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class Service2 implements Runnable { CyclicBarrier cyclicBarrier; public Service2(CyclicBarrier cyclicBarrier) { super(); this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("Services2" + cyclicBarrier.getNumberWaiting()); while (true) { try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } Nach dem Login kopieren | CountDownLatch-Beispielpublic class Main { public static void main(String args[]) throws InterruptedException { ExecutorService executors = Executors.newFixedThreadPool(4); CountDownLatch latch= new CountDownLatch(2); executors.submit(new Service1(latch)); executors.submit(new Service2(latch)); latch.await(); System.out.println("Done"); } } import java.util.concurrent.CountDownLatch; public class Service1 implements Runnable { CountDownLatch latch; public Service1(CountDownLatch latch) { super(); this.latch = latch; } @Override public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } latch.countDown(); System.out.println("Services2"+latch.getCount()); } } import java.util.concurrent.CountDownLatch; public class Service2 implements Runnable { CountDownLatch latch; public Service2(CountDownLatch latch) { super(); this.latch = latch; } @Override public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } latch.countDown(); System.out.println("Services2"+latch.getCount()); } } Nach dem Login kopieren |
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!