CountDownLatch学习记录

今天学习了一下CountDownLatch类,这个类学习完之后,发现比Object的wait和notify好用多了。
它就像一个栅栏,你可以在任何地方,将所有线程挡在某个地方,达到某个条件之后,就一起释放,他们就能同时运行。经过学习,自己写了个控制比赛选手的demo。这里每个选手就是一个线程,先等待所有选手(线程)准备,准备好了,就释放栅栏,一起出发,每个选手跑完了,继续等待,等到所有选手跑完了,就一起结束比赛。

public class CountDownLatchTest {

    /**
     * 所有选手出发前等待,由该变量控制
     * 选手等待命令
     */
    static CountDownLatch orderManage = new CountDownLatch(1);
    /**
     * 所有选手比赛结束后,才能统计分数,由该变量控制,所有选手比赛结束,等待统计
     * 比赛分数控制
     */
    static CountDownLatch pointManage;

    /**
     * 已经准备好的选手计数,当所有选手准备好了,就命令一起出发
     */
    private static AtomicInteger atomicInteger = new AtomicInteger(0);

    public static void main(String[] args) {
        int memberSize = 10;
        pointManage = new CountDownLatch(memberSize);
        for (int i = 0; i < memberSize; i++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(Thread.currentThread().getName() + "开始等待出发命令");
                        // 每有一个选手准备好,数量就++
                        atomicInteger.incrementAndGet();
                        // 线程在这里阻塞,所有选手等待命令,枪声一响,一起出发(countDown==0的时候)
                        orderManage.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "正在比赛");
                    try {
                        // 假如每个选手跑了5m
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "已经到达了啊啊啊啊");
                    // 每个选手跑完,分数官就把人员减一,直到所有人员跑完
                    pointManage.countDown();
                }
            }, "选手" + i + ":");
            thread.start();
        }

        while (true) {
        	// 准备好的人数达到memberSize个之后,才能释放栅栏
            if(atomicInteger.get() == memberSize) {
                orderManage.countDown();
                break;
            }
        }
        try {
            // 分数官就等待,所有人员跑完
            pointManage.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("所有选手跑完了,统计分数");
    }
}

运行结果:

选手0:开始等待出发命令
选手1:开始等待出发命令
选手2:开始等待出发命令
选手3:开始等待出发命令
选手6:开始等待出发命令
选手7:开始等待出发命令
选手4:开始等待出发命令
选手8:开始等待出发命令
选手5:开始等待出发命令
选手9:开始等待出发命令
选手1:正在比赛
选手2:正在比赛
选手4:正在比赛
选手3:正在比赛
选手9:正在比赛
选手5:正在比赛
选手8:正在比赛
选手6:正在比赛
选手0:正在比赛
选手7:正在比赛
选手7:已经到达了啊啊啊啊
选手0:已经到达了啊啊啊啊
选手5:已经到达了啊啊啊啊
选手4:已经到达了啊啊啊啊
选手8:已经到达了啊啊啊啊
选手6:已经到达了啊啊啊啊
选手9:已经到达了啊啊啊啊
选手1:已经到达了啊啊啊啊
选手2:已经到达了啊啊啊啊
选手3:已经到达了啊啊啊啊
所有选手跑完了,统计分数

仅仅记录自己学习过程,如若没解决您的问题,轻喷。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值