Java 并发中 CountDownLatch 和 CyclicBarrier 的区别
javaserver side programmingprogramming
CountDownLatch 和 CyclicBarrier 都用于多线程环境,它们都是其中的一部分。
根据 Java Doc −
CountDownLatch − 一种同步辅助,允许一个或多个线程等待,直到其他线程中正在执行的一组操作完成。
CyclicBarrier − 一种同步辅助,允许一组线程全部等待彼此到达公共屏障点。
Sr.否。 | Key | CyclicBarrier | CountDownLatch |
---|---|---|---|
1 | Basic | 一种同步辅助,允许一组线程全部等待彼此到达公共屏障点。 | 一种同步辅助,允许一个或多个线程等待,直到其他线程中正在执行的一组操作完成。 |
2 | Ruunable | 它有一个构造函数,可以在其中提供 Runnable。 | 它没有这样的构造函数 |
3 | Thread /Task | 它维护线程数 | 它维护任务数 |
4. | 可前进 | 不可前进 | 可前进。 |
5 | 异常 | 如果一个线程在等待时被中断,则所有其他等待线程将抛出 B rokenBarrierException | 只有当前线程将抛出 InterruptedException。它不会影响其他线程 |
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(); } } } }
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()); } }