CountDownLatch和 CyclicBarrier的使用

简介: CountDownLatch和 CyclicBarrier的使用

公众号merlinsea


  • CountDownLatch
  • CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
  • countDownLatch.await()  state>0就会一直wait
  • countDownLatch.countDown()  state-1操作
public class CountDownLatchDemo {
    public static void main(String[] args) {
        /**
         * 传入的8会赋值给CountDowmLatch内部的Sync的state
         */
        CountDownLatch countDownLatch = new CountDownLatch(8);
        new Thread(()->{
            try {
                //只有等到CountDowmLatch内部的Sync的state==0才会被唤醒
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("800米比赛结束,准备清空跑道并继续跨栏比赛");
        }).start();
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(()->{
                try {
                    Thread.sleep(finalI * 1000L);
                    System.out.println(Thread.currentThread().getName()+"到达终点");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //每执行一个线程countDownLatch中的state减1
                    countDownLatch.countDown();
                }
            }).start();
        }
    }
}


  • CyclicBarrier
  • CyclicBarrier(栅栏):表示当阻塞在这个 CyclicBarrier类上的线程达到一定数量的时候,才会同时唤醒所有阻塞在这个类上的其他线程继续向下执行。
  • CyclicBarrier和CountDownLatch的区别:CyclicBarrier是一群线程一起等待,当所有线程等待就绪了才可以一起向下执行;CountDownLatch是某个线程等待其他一群线程,只有这些线程都执行完毕以后,这个等待的线程才可以执行。
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        //当在这个cyclicBarrier等待的线程达到8个时,才允许线程会唤醒所有等待在cyclicBarrier上的线程继续执行
        CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    Thread.sleep(finalI * 1000L);
                    System.out.println(Thread.currentThread().getName() + "准备就绪");
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() +" 开始比赛");
            }).start();
        }
    }
}


相关文章
|
7月前
|
Java BI
CountDownLatch,CyclicBarrier,Semaphore
在开发过程中我们常常遇到需要对多个任务进行汇总,比如报表,或者大屏显示,需要将所有接口的数据都 获取到后再进行汇总,如果使用同步的方式,那么会比较耗时,体验不好,所以我们使用多线程,但是使用多线程 只能异步的执行,有些接口响应比较快,有些比较慢,而返回结果之间又有依赖,这样就无法汇总了, 所以我们引入了CountDownLatch,它能让所有子线程全部执行完毕后主线程才会往下执行,如果子线程没有执行完毕 ,那么主线程将无法继续向下执行。
39 0
|
3月前
CountDownLatch和CyclicBarrier你使用过吗?
CountDownLatch和CyclicBarrier你使用过吗?
25 0
|
8月前
CountDownLatch 使用详解
本文主要对CountDownLatch 的相关知识点进行了介绍和讲解
71 1
|
8月前
CyclicBarrier 使用详解
本文主要对CyclicBarrier的相关知识点进行了介绍和讲解
112 0
CountDownLatch、CyclicBarrier的使用(门栓)
CountDownLatch、CyclicBarrier的使用(门栓)
87 0
CountDownLatch&CyclicBarrier&Semaphore
本文将介绍一下CountDownLatch 、 CyclicBarrier 、 Semaphore这几个控制线程的类。
 CountDownLatch&CyclicBarrier&Semaphore
CountDownLatch
CountDownLatch是从JDK1.5开始提供的一个辅助并发编程的一个类,它位于在JUC包中。 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
116 0
CountDownLatch:别浪,等人齐再团!(3)
CountDownLatch:别浪,等人齐再团!(3)
92 0
|
Java
CountDownLatch:别浪,等人齐再团!(1)
CountDownLatch:别浪,等人齐再团!(1)
93 0
|
消息中间件
CountDownLatch&CyclicBarrier
CountDownLatch&CyclicBarrier
114 0
CountDownLatch&CyclicBarrier