Java多线程正确使用倒计时协调器CountDownLatch方法详解

 更新时间:2023年09月24日 09:17:05   作者:呆小鱼LQ  
这篇文章主要为大家介绍了Java多线程倒计时协调器CountDownLatch的正确使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

本篇文章的代码示例已放到 github 上,Git地址为:advance(记录每一个学习过程),大家把代码下载下来之后,全局搜索一些关键代码,即可找到该文章的源码。

使用场景

想想一个这样的场景:我要开始吃饭,需要先满足几个先决条件:

  • 出去买菜
  • 开始做饭
  • 把做好的饭端上桌

只有满足这几个条件之后,我才能真正开始吃饭。同时,这里吃饭的人可能不止我一个人,或许还有我的爸爸妈妈等。

CountDownLatch可以用来实现一个或者多个(注意可以有多个)线程,等待其他线程完全一组特定的操作后,才开始继续执行的操作,这些特定的操作被称作先决条件。

基本原理

CountDownLatch内部有一个表示未完成的先决条件的计数器。当某个线程执行CountDownLatch.await()时,如果此时的计数器不为0,那么这个线程就会被阻塞掉。

每当其他线程执行CountDownLatch.countDown()时,这个计数器就会被减为0时,其他被阻塞的线程就会被自动唤醒,执行后续的操作。

常用方法

//构造器,定义计数器的初始值
public CountDownLatch(int count):
//阻塞式等待
public void await()
//超时自动唤醒式等待
public boolean await(long timeout, TimeUnit unit)
//计数器减1,若此时计数器为0,则等待的那些线程会被唤醒
public void countDown()
//获取当前计数器的值
public long getCount()

使用示例

定义买菜的异步线程

public class MaiCaiThread implements Runnable{
    private CountDownLatch countDownLatch;
    public MaiCaiThread(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("出门买菜回来了");
        countDownLatch.countDown();
    }
}

定义做饭的异步线程

public class ZuoFanThread implements Runnable{
    private CountDownLatch countDownLatch;
    public ZuoFanThread(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("饭做好了");
        countDownLatch.countDown();
    }
}

定义主线程

public class Main {
    static CountDownLatch countDownLatch = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {
        Thread maicai = new Thread(new MaiCaiThread(countDownLatch));
        maicai.start();
        Thread zuoFanThread = new Thread(new ZuoFanThread(countDownLatch));
        zuoFanThread.start();
        System.out.println("我想吃饭了,但是饭还没做好");
        countDownLatch.await();
        System.out.println("程序结束,我吃上饭了");
    }
}

运行结果

注意事项

countDownLatch的计数器不能循环使用,只能只用一次,若计数器已经减为0,后续线程尽管调用await()方法,也不会生效。

如果要循环使用的话,需要使用CyclicBarrier。

以上就是Java多线程正确使用倒计时协调器CountDownLatch的详细内容,更多关于Java多线程CountDownLatch的资料请关注脚本之家其它相关文章!

相关文章

  • Java多线程场景解析volatile和AtomicLong区别原理

    Java多线程场景解析volatile和AtomicLong区别原理

    这篇文章主要为大家介绍了Java中volatile和AtomicLong的区别原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 多个springboot项目如何使用一个外部共同的application.yml

    多个springboot项目如何使用一个外部共同的application.yml

    这篇文章主要介绍了多个springboot项目如何使用一个外部共同的application.yml问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring七大事务传递机制深入分析实现原理

    Spring七大事务传递机制深入分析实现原理

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制,好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,下面这篇文章主要给大家介绍了关于Spring事务传递机制的相关资料,需要的朋友可以参考下
    2023-03-03
  • Java连接Redis全过程讲解

    Java连接Redis全过程讲解

    这篇文章主要介绍了Java连接Redis全过程讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • mybatis-plus开启sql日志打印的三种方法

    mybatis-plus开启sql日志打印的三种方法

    本文主要介绍了mybatis-plus开启sql日志打印的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 解决spring-cloud-config 多服务共享公共配置的问题

    解决spring-cloud-config 多服务共享公共配置的问题

    这篇文章主要介绍了解决spring-cloud-config 多服务共享公共配置的问题,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • JDK8环境中使用struts2的步骤详解

    JDK8环境中使用struts2的步骤详解

    这篇文章主要给大家介绍了关于在JDK8环境中使用struts2的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Scala 操作Redis使用连接池工具类RedisUtil

    Scala 操作Redis使用连接池工具类RedisUtil

    这篇文章主要介绍了Scala 操作Redis使用连接池工具类RedisUtil,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • nacos配置注册中心时指定命名空间不起作用的问题

    nacos配置注册中心时指定命名空间不起作用的问题

    这篇文章主要介绍了nacos配置注册中心时指定命名空间不起作用的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Java ArrayList类的基础使用讲解

    Java ArrayList类的基础使用讲解

    数组的长度是固定的,无法适应数据变化的需求。为了解决这个问题,Java提供了另一个容器 java.util.ArrayList集合类,让我们可以更便捷的存储和操作对象数据。本文就将通过示例聊聊ArrayList类的基础使用,感兴趣的可以了解一下
    2022-10-10

最新评论