一篇不到300字短文,带你彻底理解Java并发包中CountDownLatch

本篇文章主要介绍了Java并发包中CountDownLatch的作用、使用场景、使用中的注意事项以及其相关扩展内容,让大家更好地运用Java并发包中的并发工具类

了解CountDownLatch

Thread.join()实现的是一个线程等待另一个线程结束。但是如果有时候一个线程只需要等待其他线程特定操作完成,不需要等待这些线程终止。这时候可以通过Java并发包中的Condition条件变量来实现,但是Java并发包中提供了更加方便直接的工具类——
java.util.concurrent.CountDownLatch。

CountDownLatch可以实现一个(或者多个)线程等待其他线程完成一组特定操作之后继续运行,这组操作被称为先决操作。其内部维护了一个用于表示未完成的先决操作数量的计数器。CountDownLatch.countDown()每次被调用就会使相应实例的计数器值减1。CountDownLatch.await()用来实现等待操作。当计数器值为0时CountDownLatch.await()为空操作;当计数器值不为0时CountDownLatch.await()执行的线程会暂停执行。

CountDownLatch构造方法:public CountDownLatch(int count),这里的count值为计数器的初始化值。

当count减为0时,count值不会在变化,此时调用CountDownLatch.countDown()不会抛出异常,并且后续执行CountDownLatch.await()的线程不会被暂停,所以 CountDownLatch是一次性的,一个CountDownLatch实例只能实现一次等待唤醒。

CountDownLatch使用案例

public class CountDownLatchMain {

    public static void main(String[] args) throws InterruptedException {
        //参会人员一共3个,所以这里计数器设置为3。
        CountDownLatch countDownLatch = new CountDownLatch(3);
        //A 、B、C参会人员模拟签到操作 每个人签到一次计数器减1
        new Person("A", countDownLatch).signIn();
        new Person("B", countDownLatch).signIn();
        new Person("C", countDownLatch).signIn();
        // A 、B、C参会人员所有人签到完成,计数器为0,await则继续执行后续抽奖
        countDownLatch.await();
        System.out.println("主持人:开始抽奖!");
    }

    //模拟参会人员
    static class Person extends Thread{

        private CountDownLatch countDownLatch;

        private String name;

        public Person(String name, CountDownLatch countDownLatch){
            this.countDownLatch = countDownLatch;
            this.name = name;
        }

        //模拟签到
        public void signIn(){
            new SignIn(name, countDownLatch).start();
        }
    }

    //模拟签到工作
    static class SignIn extends Thread{
        private CountDownLatch countDownLatch;

        private String name;

        public SignIn(String name, CountDownLatch countDownLatch){
            this.countDownLatch = countDownLatch;
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println(name + "签到完成");
            countDownLatch.countDown();
        }
    }
}

运行结果

上述代码模拟了会场所有人员签到完成后再进行抽奖的场景,参会人员签到执行countDownLatch.countDown()用来表示签到完成。CountDownLatch计数器为0时,则主持人开始抽奖。

CountDownLatch扩展

CountDownLatch.await()另一个版本:

public boolean await(long timeout, TimeUnit unit)

这个版本的await方法允许指定一个超时时间,如果CountDownLatch实例await时间超过设置的超时时间,即使计数器不为0,被await的线程也会被唤醒。此方法返回的boolean值结果用来区分是否由于超时等待唤醒。

对于同一个CountDownLatch实例latch,latch.countDown()的执行线程在执行该方法之前所执行的任何内存操作对等待线程在latch.await()调用返回之后的代码是可见而且有序的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值