美文网首页
CountdownLatch和CyclicBarrier的区别

CountdownLatch和CyclicBarrier的区别

作者: xiaohei_e853 | 来源:发表于2022-03-16 10:20 被阅读0次

    CyclicBarrier 是能循环使用的,调用reset方法就能循环使用

    image.png image.png

    只有await阻塞方法,没有countdownlatch,相当于把countdownlatch的countdown()方法和await()方法组合在一起了

    CyclicBarrier 使用场景
    我们重新模拟一个新的场景,就用已经被说烂的跑步场景吧,十名运动员各自准备比赛,需要等待所有运动员都准备好以后,裁判才能说开始然后所有运动员一起跑,代码实现如下

    public static void main(String[] args) {
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(10,()->{
                System.out.println("所有人都准备好了裁判开始了");
            });
            for (int i = 0; i < 10; i++) {
                //lambda中只能只用final的变量
                final int times = i;
                new Thread(() -> {
                    try {
                        System.out.println("子线程" + Thread.currentThread().getName() + "正在准备");
                        Thread.sleep(1000 * times);
                        System.out.println("子线程" + Thread.currentThread().getName() + "准备好了");
                        cyclicBarrier.await();
                        System.out.println("子线程" + Thread.currentThread().getName() + "开始跑了");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
    
    
        }
    

    子线程Thread-0正在准备
    子线程Thread-2正在准备
    子线程Thread-1正在准备
    子线程Thread-3正在准备
    子线程Thread-4正在准备
    子线程Thread-0准备好了
    子线程Thread-5正在准备
    子线程Thread-6正在准备
    子线程Thread-7正在准备
    子线程Thread-8正在准备
    子线程Thread-9正在准备
    子线程Thread-1准备好了
    子线程Thread-2准备好了
    子线程Thread-3准备好了
    子线程Thread-4准备好了
    子线程Thread-5准备好了
    子线程Thread-6准备好了
    子线程Thread-7准备好了
    子线程Thread-8准备好了
    子线程Thread-9准备好了
    所有人都准备好了裁判开始了
    子线程Thread-9开始跑了
    子线程Thread-0开始跑了
    子线程Thread-2开始跑了
    子线程Thread-1开始跑了
    子线程Thread-7开始跑了
    子线程Thread-6开始跑了
    子线程Thread-5开始跑了
    子线程Thread-4开始跑了
    子线程Thread-3开始跑了
    子线程Thread-8开始跑了

    CountdownLatch 使用场景

    
    public static void main(String[] args) {
            final CountDownLatch latch = new CountDownLatch(10);
            for (int i = 0; i < 10; i++) {
                //lambda中只能只用final的变量
                final int times = i;
                new Thread(() -> {
                    try {
                        System.out.println("子线程" + Thread.currentThread().getName() + "正在赶路");
                        Thread.sleep(1000 * times);
                        System.out.println("子线程" + Thread.currentThread().getName() + "到公司了");
                        //调用latch的countDown方法使计数器-1
                        latch.countDown();
                        System.out.println("子线程" + Thread.currentThread().getName() + "开始工作");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
    
    
            try {
                System.out.println("门卫等待员工上班中...");
                //主线程阻塞等待计数器归零
                latch.await();
                System.out.println("员工都来了,门卫去休息了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    

    子线程Thread-0正在赶路
    子线程Thread-2正在赶路
    子线程Thread-0到公司了
    子线程Thread-0开始工作
    子线程Thread-1正在赶路
    门卫等待员工上班中...
    子线程Thread-4正在赶路
    子线程Thread-9正在赶路
    子线程Thread-5正在赶路
    子线程Thread-6正在赶路
    子线程Thread-7正在赶路
    子线程Thread-8正在赶路
    子线程Thread-3正在赶路
    子线程Thread-1到公司了
    子线程Thread-1开始工作
    子线程Thread-2到公司了
    子线程Thread-2开始工作
    子线程Thread-3到公司了
    子线程Thread-3开始工作
    子线程Thread-4到公司了
    子线程Thread-4开始工作
    子线程Thread-5到公司了
    子线程Thread-5开始工作
    子线程Thread-6到公司了
    子线程Thread-6开始工作
    子线程Thread-7到公司了
    子线程Thread-7开始工作
    子线程Thread-8到公司了
    子线程Thread-8开始工作
    子线程Thread-9到公司了
    子线程Thread-9开始工作

    员工都来了,门卫去休息了

    相关文章

      网友评论

          本文标题:CountdownLatch和CyclicBarrier的区别

          本文链接:https://www.haomeiwen.com/subject/rkxpdrtx.html