等待多个并发事件的完成:CountDownLatch

java 并发API提供了CountDownLatch类,它是一个同步辅助类。在完成一组正在其它线程中执行的操作之
前,它允许线程一直等等。这个类使用一个整数进行初始化,这个整数就是线程要等等完成的操作的数目。

当一个线程要等待某些操作先执行完成时,需要调用await()方法,这个方法让线程进入休眠直到等待的所有
操作都完成。当某一个操作完成,它将调用cuntDown()方法将CountDownLatch类内部计数器减1。当计数
器变成0的时候,CountDownLatch类将唤醒所有调用await()方法而进入休眠的线程。

CountDownLatch 对象的内部计数器被初始化之后就不能被再次初始化或者修改。
一旦计数器被初始化后,唯一能改变参数值的方法是countDown(),当计数器到达0
时,所有因调用await()方法而等待的线程立即被唤醒,再执行countDown()将不起作用。

 


/**
 * 视频会议,当所有参与者都到齐才开始
 */
static class VideoConference implements Runnable {
    private final CountDownLatch controller;

    public VideoConference(int number) {
        this.controller = new CountDownLatch(number);
    }

    //每一个参与者到场时,这个方法将被调用
    public void arrive(String people) {
        this.controller.countDown();
        System.out.println(people + "到了,还差" + this.controller.getCount() + "位。");
    }

    @Override
    public void run() {
        System.out.println("这次会议共" + this.controller.getCount() + "人参加");
        try {
            controller.await();
            System.out.println("会议开始了...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 参与者
 */
static class People implements Runnable {
    private final String name;
    private final VideoConference videoConference;

    public People(String name, VideoConference videoConference) {
        this.name = name;
        this.videoConference = videoConference;
    }

    @Override
    public void run() {
        long duration = (long) (Math.random() * 10);
        try {
            TimeUnit.SECONDS.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.videoConference.arrive(this.name);
    }
}

public static void main(String[] args) {

    VideoConference videoConference = new VideoConference(5);
    new Thread(videoConference).start();

    Stream.of("张三", "李四", "王五", "陈六", "赵七").forEach(name -> {
        new Thread(new People(name, videoConference)).start();
    });
}

 

这次会议共5人参加
李四到了,还差4位。
赵七到了,还差3位。
陈六到了,还差2位。
张三到了,还差1位。
王五到了,还差0位。
会议开始了...

《摘自 java7并发编程实战》

 

转载于:https://my.oschina.net/u/2552286/blog/1926047

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值