学习多线程之CountDownLatch使用

简介: 学习多线程之CountDownLatch使用

写在前面


我们今天来学习多线程中的另一个工具类CountDownLatch,名叫同步计数器。

和昨天的文章中的Semaphore信号量工具一样,都是实现多线程中锁的工具类。

那下面我们就来看一下这个工具类到底如何使用吧。


学习多线程之CountDownLatch使用


CountDownLatch,同步计数器,功能和他的名称一样,就是用来计数的,但是这个数字是递减的数字,在线程操作时,这个数字只有递减到0时,才能使得指定的线程开始运行。

我们还是来看一下这个工具类是如何使用的吧,从如下代码中看看:

public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(4);
    Thread thread0 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread0运行ing"+System.currentTimeMillis());
            countDownLatch.countDown();
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread1运行ing"+System.currentTimeMillis());
            countDownLatch.countDown();
        }
    });
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread2运行ing"+System.currentTimeMillis());
            countDownLatch.countDown();
        }
    });
    Thread thread3 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread3运行ing"+System.currentTimeMillis());
            Thread.sleep(3000);
            countDownLatch.countDown();
        }
    });
    thread0.start();
    thread1.start();
    thread2.start();
    thread3.start();
    countDownLatch.await();
    System.out.println("主线程开始执行"+System.currentTimeMillis());
}

我们试着运行这个代码示例,可以得到一个结果,如下:

thread0运行ing1645867471594

thread2运行ing1645867471595

thread1运行ing1645867471596

thread3运行ing1645867471596

主线程开始执行1645867474606

从代码中,我们首先声明了一个CountDownLatch对象,并且将其填充了4个位,代表这个对象可以被递减四次。

接着,通过四个线程同时执行,前三个线程没有任何的区别,只是打印出当前时间和将CountDownLatch对象进行递减。

但是我们将第四个线程睡眠三秒钟;然后在主线程中执行了await方法,通过这个方法,可以让主线程等待CountDownLatch对象递减到0才可以开始运行。

通过这个结果,我们也获得到了想要的结果,主线程等待了三秒钟后,才正常运行起来。

这就是CountDownLatch工具类的使用方法了。


相关文章
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
56 0
|
1月前
|
Java C++
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
33 0
|
2月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
134 6
【Java学习】多线程&JUC万字超详解
|
5月前
|
Java
Runnable+CountDownLatch多线程的等待和通知
Runnable+CountDownLatch多线程的等待和通知
|
5月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
34 1
|
4月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
27 0
|
6月前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
55 4
|
5月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
127 0
|
5月前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
26 0
|
5月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
183 0