Computer >> Máy Tính >  >> Lập trình >> Java

Sự khác biệt giữa CountDownLatch và CyclicBarrier trong Java Concurrency

CountDownLatch và CyclicBarrier đều được sử dụng trong môi trường đa luồng và cả hai đều là một phần của.

Theo Java Doc -

CountDownLatch - Một công cụ hỗ trợ đồng bộ hóa cho phép một hoặc nhiều luồng đợi cho đến khi một tập hợp các thao tác được thực hiện trong các luồng khác hoàn thành.

CyclicBarrier - Một công cụ hỗ trợ đồng bộ hóa cho phép một tập hợp các luồng chờ nhau đạt đến một điểm rào cản chung.

Sr. Không. Phím CyclicBarrier CountDownLatch
1
Cơ bản
Một công cụ hỗ trợ đồng bộ hóa cho phép một tập hợp tất cả các luồng chờ nhau đạt đến một điểm rào cản chung.


Một công cụ hỗ trợ đồng bộ hóa cho phép một hoặc nhiều luồng đợi cho đến khi một tập hợp các thao tác được thực hiện trong các luồng khác hoàn tất.


2
Có thể chạy được
Nó có một hàm tạo mà Runnable có thể được cung cấp.
Nó không có hàm tạo như vậy
3
Chủ đề / Tác vụ
Nó duy trì một số lượng các chủ đề
Nó duy trì một số nhiệm vụ
4.
Có thể liên quan
Nó không thể cải thiện được
Nó có thể cải tiến.
5
Ngoại lệ
Nếu một luồng bị gián đoạn trong khi chờ đợi thì tất cả các luồng đang chờ khác sẽ ném B rokenBarrierException
Chỉ chuỗi hiện tại sẽ ném
Ngoại lệ bị gián đoạn. Nó sẽ không ảnh hưởng đến các chủ đề khác

Ví dụ về 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();
         }
      }
   }
}

Ví dụ về 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());
   }
}