理解java的 CountDownLatch 和 CyclicBarrier

所谓CountDownLatch,字面理解就是计数,然后闭锁,所谓闭锁,就是在闭锁到达结束状态之前,这扇门一直是关闭着的,不允许任何线程通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。举个栗子说明,比如两个任务,任务一可以并发进行,任务二则要等到至少2个任务一完成后才能开始

public class CountDownLatchDemo {

    static final CountDownLatch countDownLatch = new CountDownLatch(2); 

    static class Mission1 implements Runnable{
        private String name;
        public Mission1(String name){
            this.name = name;
        }
        @Override
        public void run() {
            for(int i=0;i<5;i++){
                System.out.println(name + " misssion1 running " + i);
            }
            countDownLatch.countDown();
        }
    }

    static class Mission2 implements Runnable{
        private String name;
        public Mission2(String name){
            this.name = name;
        }
        @Override
        public void run() {
            try {
                countDownLatch.await();
                for(int i=0;i<5;i++){
                    System.out.println(name + " misssion2 running " + i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new Mission1("m11")).start();
        new Thread(new Mission1("m12")).start();
        new Thread(new Mission2("m2")).start();
    }
}

输出如下:
m12 misssion1 running 0
m12 misssion1 running 1
m12 misssion1 running 2
m12 misssion1 running 3
m11 misssion1 running 0
m12 misssion1 running 4
m11 misssion1 running 1
m11 misssion1 running 2
m11 misssion1 running 3
m11 misssion1 running 4
m2 misssion2 running 0
m2 misssion2 running 1
m2 misssion2 running 2
m2 misssion2 running 3
m2 misssion2 running 4

可见任务1 的两个线程是并行执行,二任务2则是2个任务1线程执行完毕后才启动。

说完CountDownLatch,再说说CyclicBarrier,CountDownLatch是做减法,减到0,await的方法就不再阻塞,那CyclicBarrier就是做加法,不同是CyclicBarrier的await本身就是做自增长,await达到数量后就可以集体往下了执行了

Demo示例

public class CyclicBarrierDemo {
    static CyclicBarrier barrier = new CyclicBarrier(3); 
    static class Mission implements Runnable{
        private String name;
        public Mission(String name){
            this.name = name;
        }
        @Override
        public void run() {
            for(int i=0;i<5;i++){
                System.out.println(name + " misssion1 running " + i);
                if(i==3){
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        new Thread(new Mission("m1")).start();
        new Thread(new Mission("m2")).start();
        new Thread(new Mission("m3")).start();
    }
}

输出结果:
m1 misssion1 running 0
m3 misssion1 running 0
m3 misssion1 running 1
m3 misssion1 running 2
m3 misssion1 running 3
m2 misssion1 running 0
m1 misssion1 running 1
m2 misssion1 running 1
m1 misssion1 running 2
m2 misssion1 running 2
m1 misssion1 running 3
m2 misssion1 running 3
m2 misssion1 running 4
m3 misssion1 running 4
m1 misssion1 running 4

可以看到3个线程执行到3的时候就会停下来,等所有线程都到了3,再继续执行4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值