Heim  >  Artikel  >  Java  >  Was ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität?

Was ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität?

WBOY
WBOYnach vorne
2023-09-06 15:33:121262Durchsuche

Was ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität?

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.

tr>Kann erweitert werdenAusnahme CountDownLatch-Beispiel
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.

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-Beispiel

public 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();
         }
      }
   }
}

public 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());
   }
}

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!

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