【多线程】CountDownLatch

CountDownLatch

同时等待 N 个任务执行结束.

好像跑步比赛,10个选手进行比赛, 所有选手都通过终点,才能公布成绩。

代码示例:

  • 构造 CountDownLatch 实例, 初始化 10 表示有 10 个任务需要完成.
  • 每个任务执行完毕, 都调用 latch.countDown() . 在 CountDownLatch 内部的计数器同时自减.
  • 主线程中使用 latch.await(); 阻塞等待所有任务执行完毕. 相当于计数器为 0 了.
class Test{
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(10);
        Random random = new Random();

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                int time = random.nextInt(3);
                try {
                    Thread.sleep(time*1000);
                    System.out.println(Thread.currentThread().getName() + "跑到终点了!");
                    // 线程跑到终点了
                    latch.countDown();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        };
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(runnable);
            t.start();
        }

        // 必须等到 10 个线程都跑到终点才继续执行
        latch.await();

        System.out.println("10 个线程都已跑到终点");
    }
}

实际开发中 CountDownLatch 也是有许多应用场景的,
比如下载一个大文件, 如 视频,好几个 G,

  • 就可以把一个大的文件分成好几个小一点的文件, 使用多个线程分别下载, 这样就比单个线程下载的快.
  • 使用 CountDownLatch 就可以区分是否将一个文件的所有部分都下载完了.
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值