JUC之countDownLatch详解

CountDownLatch

一:CountDownLatch介绍

CountDownLatch 是一个多线程控制工具类,用来控制线程等待,它可以让某个线程等待直到倒计时结束,再执行。

二:案例

API:

public CountDownLatch (int count)

模拟一个场景,现在有3个服务,我们必须等待3个服务全部完成之后才能调用主线程

public class CountDownLatchDemo {
    public static void main(String args[])
            throws InterruptedException
    {
        CountDownLatch latch = new CountDownLatch(3);

        // 开启3个服务并启动
        Service first = new Service(1000, latch,
                "SERVICE-1");
        Service second = new Service(2000, latch,
                "SERVICE-2");
        Service third = new Service(3000, latch,
                "SERVICE-3");
        first.start();
        second.start();
        third.start();

        // 主线程等待服务完成
        latch.await();

        System.out.println(Thread.currentThread().getName() +
                " has finished");
    }
}

// 服务线程
class Service extends Thread
{
    // 服务执行时间
    private int delay;
    private CountDownLatch latch;

    public Service(int delay, CountDownLatch latch,
                  String name)
    {
        super(name);
        this.delay = delay;
        this.latch = latch;
    }

    @Override
    public void run()
    {
        try {
            Thread.sleep(delay);
            // 服务完成,调用countDown,倒计时减1
            latch.countDown();
            System.out.println(Thread.currentThread().getName()
                    + " finished");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

说明:通过 CountDownLatch latch = new CountDownLatch(3)来生成countDownLatch实例,3表示需要3个线程完成任务。通过 latch.await()告诉main线程必须等待我的所有线程全部执行完才可以执行main线程。当我们执行完一个线程任务的时候,调用latch.countDown()可以告知计时器减1,当计时器为0的时候,才会执行main线程,所以要注意计时器的个数是否和线程数目匹配。

三:countDownLatch使用以及注意点

场景:
当线程像main一样,使用CountDownLatch 时,需要等待一个或多个线程完成,然后才开始进行处理,就可以使用countDownLatch,在Java 中使用CountDownLatch的经典示例是使用服务体系结构的任何服务器端核心Java应用程序,其中多个服务由多个线程提供,并且应用程序无法在所有服务成功启动之前开始处理.

注意点:

  1. 一旦count达到零,不能再用CountDownLatch。
  2. 主线程通过调用CountDownLatch.await()方法等待Latch,而其他线程调用CountDownLatch.countDown()以通知它们已完成。
  3. 计数器必须和要执行的线程数匹配,如果计数器大于了要执行的线程数目,那么count最后不会为0,调用的主线程也不会继续执行,主线程将会一直处于阻塞状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mindcarver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值