CountDownLatch和cyclicBarrier 的使用

本文详细解析了Java并发控制中的CountDownLatch和CyclicBarrier类的使用方法及场景。CountDownLatch作为计数器,用于等待多个线程完成后再执行后续操作;而CyclicBarrier则用于使一组线程相互等待,直到所有线程达到屏障点后一起执行。通过实例演示了两种方式的异同。

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

CountDownLatch

这个类使用起来比较简单.使用场景就是 你需要很多线程执行结束之后才执行最后的代码,那用这个就对了. 这个类底层是用aqs来实现的.

这类主要使用的方法

count.await();
count.countDown();

里面的API很少

结束线程await()

1.countDown

2.被阻塞的线程interrupt()

  private static CountDownLatch count = new CountDownLatch(1);
    public static void main(String[] args) throws InterruptedException {
        Thread t =Thread.currentThread();

        new Thread(()->{
            try {
                Thread.sleep(2000);
                t.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

        System.out.println("阻塞....");
        count.await();
        System.out.println("=====");

    }
}
View Code

 就是比如你有几个线程需要跑批你的任务你可以在countDown初始化的时候把线程数方进入

每一个线程结束的时候调用coutDown -1 等所有线程都执行结束之后.可以进行汇总

cyclicBarrier

cyclicBarrier 和countDownLatch有点相似,不过他们是不同的.

countDownLatch 是初始化一个线程数 做一个计数器的功能.相当于一个裁判,线程相当于一个一个选手.当所有选手都结束的时候,才会总的进行分数.或者其他的运算

cyclicBarrier 也有自己的初始值,只不过他的模式,是让线程直接互相等待,打一个比方,比如去聚会,需要10个人才能吃饭,但是现在来了9个人,大家都在等这第10个人来了.才开始一起吃饭.

就是有个await()方法当所有线程调用都到达这里的时候才会一起去执行下面的代码.

    public static void main(String[] args) throws InterruptedException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2);

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(10);
                System.out.println("t1 finied ");
                cyclicBarrier.await();
                System.out.println("t1 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();
        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("t2 finished ");
                cyclicBarrier.await();
                System.out.println("t2 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();

        Thread.currentThread().join();
    }

t2 finished
t1 finied
t1 结束..await'
t2 结束..await'

回调的方式

 public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{
            System.out.println("所有都结束了");
        });

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(10);
                System.out.println("t1 finied ");
                cyclicBarrier.await();
                System.out.println("t1 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();
        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("t2 finished ");
                cyclicBarrier.await();
                System.out.println("t2 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();

    }
View Code

 

转载于:https://www.cnblogs.com/bj-xiaodao/p/10819130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值