Java多线程系列(二十一)CyclicBarrier使用

本文通过一个示例代码详细解释了CyclicBarrier和CountDownLatch两种同步工具的区别。CyclicBarrier使所有线程在达到某个点时等待,直到所有线程到达该点才一起继续执行;而CountDownLatch允许一个或多个线程等待其他线程完成操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单来说原理就是:“人满发车”

代码如下

CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
            
            @Override
            public void run() {
                System.out.println("barrier run");
                
            }
        });
        
        
        Thread thread1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                while(true) {
                    try {
                        Random random = new Random();
                        Thread.sleep(random.nextInt(1000)+1000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    System.out.println("thread1 一次循环开始");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("thread1 一次循环结束");
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                while(true) {
                    try {
                        Random random = new Random();
                        Thread.sleep(random.nextInt(1000)+1000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    System.out.println("thread2 一次循环开始");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("thread2 一次循环结束");
                }
                
            }
        });
        Thread thread3 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                while(true) {
                    try {
                        Random random = new Random();
                        Thread.sleep(random.nextInt(1000)+1000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    
                System.out.println("thread3 一次循环开始");
                try {
                    barrier.await();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("thread3 一次循环结束");}
                
            }
        });
        
        thread1.start();
        thread2.start();
        thread3.start();

打印结果:

thread2 一次循环开始
thread3 一次循环开始
thread1 一次循环开始
barrier run
thread1 一次循环结束
thread2 一次循环结束
thread3 一次循环结束
thread3 一次循环开始
thread2 一次循环开始
thread1 一次循环开始
barrier run
thread1 一次循环结束
thread3 一次循环结束
thread2 一次循环结束
thread2 一次循环开始
thread1 一次循环开始
thread3 一次循环开始
barrier run
thread3 一次循环结束
thread2 一次循环结束
thread1 一次循环结束
thread3 一次循环开始
thread2 一次循环开始
thread1 一次循环开始
barrier run

 

cyclicBarrier与countDownLatch

区别在于前者所有线程await后都在等,然后所有线程一起执行

后者所有线程countDown后 countDownLatch wait的那个线程会继续执行

前者阻塞所有线程,后者只阻塞一个线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值