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


相关文章
|
6月前
CountDownLatch和CyclicBarrier你使用过吗?
CountDownLatch和CyclicBarrier你使用过吗?
42 0
|
6月前
CyclicBarrier 的使用
CyclicBarrier 的使用
31 2
|
6月前
|
Java
CountDownLatch的使用
CountDownLatch的使用
48 1
CountDownLatch 使用详解
本文主要对CountDownLatch 的相关知识点进行了介绍和讲解
121 1
CyclicBarrier 使用详解
本文主要对CyclicBarrier的相关知识点进行了介绍和讲解
155 0
CountDownLatch&CyclicBarrier&Semaphore
本文将介绍一下CountDownLatch 、 CyclicBarrier 、 Semaphore这几个控制线程的类。
 CountDownLatch&CyclicBarrier&Semaphore
CountDownLatch
CountDownLatch是从JDK1.5开始提供的一个辅助并发编程的一个类,它位于在JUC包中。 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
138 0
|
Java
CountDownLatch:别浪,等人齐再团!(2)
CountDownLatch:别浪,等人齐再团!(2)
101 0
CountDownLatch:别浪,等人齐再团!(2)
|
消息中间件
CountDownLatch&CyclicBarrier
CountDownLatch&CyclicBarrier
140 0
CountDownLatch&CyclicBarrier
CountDownLatch、CyclicBarrier的使用(门栓)
CountDownLatch、CyclicBarrier的使用(门栓)
104 0