CyclicBarrier CountDownLatch 自增与自减

正经学徒,佛系记录,不搞事情

概括

多线程经常结合这两个辅助工具类使用,目的都是为了等待多个线程处理完后再继续执行程序,可以简单的理解成 CountDownLatch 是在递减等待,而 CyclicBarrier 是在递增等待

CountDownLatch
//初始化7个,这数值一定要保证最终会被全部减掉
CountDownLatch countDownLatch = new CountDownLatch(7);
for(int i=1;i<=7;i++){
    final int temp = i;
    new Thread(()->{
        System.out.println("已消灭第"+temp+"个bug");
        countDownLatch.countDown();//-1操作
    }).start();
}
try {
	//会阻塞程序,直到countDownLatch减到0后才会继续往下执行
    countDownLatch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("bug已全部消灭");

执行结果:
在这里插入图片描述

CyclicBarrier
//初始化7个,并在阻塞过后执行runable
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
	try {
		//为了验证runable先执行还是await后的方法先执行
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("居然有7个bug,准备祭天");
});
for(int i=1;i<=7;i++){
    final int temp = i;
    new Thread(()->{
        System.out.println("发现第"+temp+"个bug");
        try {
            //+1操作,与CountDownLatch不同,将在线程内阻塞,这也是cyclicBarrier和CountDownLatch不同的使用场景
            //直到cyclicBarrier加到7时,先执行完runable的方法后,所有cyclicBarrier.await()全部放行
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println("集体祭天:祭天发现第"+temp+"个bug的程序员");
    }).start();
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My name is Red ^^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值