Rumah >Java >javaTutorial >Apakah perbezaan antara CountDownLatch dan CyclicBarrier dalam konkurensi Java?

Apakah perbezaan antara CountDownLatch dan CyclicBarrier dalam konkurensi Java?

WBOY
WBOYke hadapan
2023-09-06 15:33:121303semak imbas

Apakah perbezaan antara CountDownLatch dan CyclicBarrier dalam konkurensi Java?

Kedua-dua CountDownLatch dan CyclicBarrier digunakan dalam persekitaran berbilang benang, dan kedua-duanya adalah sebahagian daripada persekitaran berbilang benang.

Menurut Java Doc -

CountDownLatch - Alat bantuan penyegerakan yang membolehkan satu atau lebih utas menunggu sehingga satu set operasi yang dilakukan dalam urutan lain selesai.

CyclicBarrier - Alat bantuan penyegerakan yang membolehkan sekumpulan benang menunggu antara satu sama lain untuk mencapai titik halangan yang sama.

4. tr>5Contoh CountDownLatch
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());
   }
}
En. No. key cyclicbarrier countdownlatch
1

basic

membolehkan penyegerakan sekumpulan benang yang menunggu satu sama lain untuk mencapai titik penghalang yang sama.

Alat bantuan penyegerakan yang membolehkan satu atau lebih utas menunggu sehingga satu set operasi yang dilakukan dalam urutan lain selesai.

2

Runnable

Ia mempunyai pembina yang menyediakan Runnable.

Ia tidak mempunyai pembina sedemikian

Boleh advance

Tidak digalakkan guna

Disyorkan untuk digunakan.

exception

Jika satu benang terganggu semasa menunggu, semua benang menunggu yang lain akan membuang b rokenbarrierexcepti

Contoh CyclicBarrier

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

Atas ialah kandungan terperinci Apakah perbezaan antara CountDownLatch dan CyclicBarrier dalam konkurensi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam