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