Java中CountDownLatch介绍与应用

2023-05-16

  正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。

CountDownLatch是什么

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

在这里插入图片描述
在这里插入图片描述
CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,此时cnt计数器的值就会减1。这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。

 设置cnt初始值为3
 CountDownLatch cnt=new CountDownLatch(3);
 TA线程启动
 调用cnt.await()方法
 TA线程等待
 T1线程执行完成
 调用cnt.countDown()方法,此时 cnt=3-1=2
 T2线程执行完成
 调用cnt.countDown()方法,此时 cnt=2-1=1
 T3线程执行完成
 调用cnt.countDown()方法,此时 cnt=1-1=0
 cnt=0 重新唤醒TA主线程继续执行

CountDownLatch如何工作

举个例子,有三个工人在为老板干活,这个老板有一个习惯,就是当三个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:三个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板,具体的代码实现如下:
如上图所示:

Worker

import java.util.Random;  
import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.TimeUnit;  
  
public class Worker implements Runnable{  
      
    private CountDownLatch downLatch;  
    private String name;  
      
    public Worker(CountDownLatch downLatch, String name){  
        this.downLatch = downLatch;  
        this.name = name;  
    }  
      
    public void run() {  
        this.doWork();  
        try{  
            TimeUnit.SECONDS.sleep(new Random().nextInt(10));  
        }catch(InterruptedException ie){  
        }  
        System.out.println(this.name + "活干完了!");  
        this.downLatch.countDown();  
          
    }  
      
    private void doWork(){  
        System.out.println(this.name + "正在干活!");  
    }  
      
}  

Boss

import java.util.concurrent.CountDownLatch;  
  
public class Boss implements Runnable {  
  
    private CountDownLatch downLatch;  
      
    public Boss(CountDownLatch downLatch){  
        this.downLatch = downLatch;  
    }  
      
    public void run() {  
        System.out.println("老板正在等所有的工人干完活......");  
        try {  
            this.downLatch.await();  
        } catch (InterruptedException e) {  
        }  
        System.out.println("工人活都干完了,老板开始检查了!");  
    }  
  
}  

CountDownLatchDemo

import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class CountDownLatchDemo {  
  
    public static void main(String[] args) {  
        ExecutorService executor = Executors.newCachedThreadPool();  
          
        CountDownLatch latch = new CountDownLatch(3);  
          
        Worker w1 = new Worker(latch,"张三");  
        Worker w2 = new Worker(latch,"李四");  
        Worker w3 = new Worker(latch,"王二");  
          
        Boss boss = new Boss(latch);  
          
        executor.execute(w3);  
        executor.execute(w2);  
        executor.execute(w1);  
        executor.execute(boss);  
          
        executor.shutdown();  
    }  
  
}  

当你运行CountDownLatchDemo这个对象的时候,你会发现是等所有的工人都干完了活,老板才来检查,下面是我本地机器上运行的一次结果,可以肯定的每次运行的结果可能与下面不一样,但老板检查永远是在后面的。

王二正在干活!  
李四正在干活!  
老板正在等所有的工人干完活......  
张三正在干活!  
张三活干完了!  
王二活干完了!  
李四活干完了!  
工人活都干完了,老板开始检查了!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中CountDownLatch介绍与应用 的相关文章

随机推荐

  • Linux 多进程多线程编程

    一 创建进程 1 进程号 进程号的类型是pid t xff08 typedef unsigned int pid t xff09 获得进程和父进程ID的API如下 xff1a include lt sys types h gt includ
  • dpdk探究1-理解dpdk的运行逻辑

    DPDK介绍 DPDK主要功能 xff1a 利用IA xff08 intel architecture xff09 多核处理器进行高性能数据包处理 Linux下传统的网络设备驱动包处理的动作可以概括如下 xff1a 数据包到达网卡设备网卡设
  • C++11多线程实现的一道面试题

    题目 xff1a 子线程循环 10 次 xff0c 接着主线程循环 100 次 xff0c 接着又回到子线程循环 10 次 xff0c 接着再回到主线程又循环 100 次 xff0c 如此循环50次 xff0c 试写出代码 这里涉及到的问题
  • 第四章 智能指针

    裸指针问题如下 xff1a 裸指针在声明中并未指出 xff0c 裸指针指涉到的是单个对象还是一个数组 裸指针在声明中也没有提示是不是要对其进行虚构 换言之 xff0c 无法得知指针是否拥有其指涉的对象 或者是否空悬指针的析构是不是拥有重载的
  • dpdk无锁队列

    这篇博客是从网上博客整理摘抄而来 xff0c 具体参考的博客内容在文末给出 Linux无锁队列 kfifo概述 Linux内核中有一个先进先出的数据结构 xff0c 采用环形队列的数据结构来实现 xff0c 提供一个无边界的字节流服务 最重
  • C++虚函数和虚函数表原理

    虚函数的地址存放于虚函数表之中 运行期多态就是通过虚函数和虚函数表实现的 类的对象内部会有指向类内部的虚表地址的指针 通过这个指针调用虚函数 虚函数的调用会被编译器转换为对虚函数表的访问 xff1a ptr gt span class hl
  • 非递归快排

    非递归快排 通过使用栈来模拟函数栈的调用 xff0c 每次将首尾指针存入到栈中 xff0c 并对首尾之间区域进行快排 span class hljs preprocessor include lt iostream gt span span
  • ppt基础篇--自学笔记

    字体 给文字加边框 加背景 底纹logo 方框 加透明框 拆分 字体镂空 不规则图形 xff08 结合背景 xff09 图片 删除背景 xff08 两张叠加 xff09 点击设置透明色 xff08 背景为纯色 xff09 背景虚化 添加矩形
  • Golang Assertion

    Go中所有的类型都可以被转化成interface xff0c 通常在传入可变参数中的API中 xff0c 可变参数的类型就是interface func typeConversion strs interface ret string fo
  • 解决Idea Maven生成的jar运行出现“没有主清单属性”问题

    1 问题描述 通过maven构建了jar文件 xff0c 如图所示 2 命令窗口运行jar 提示 没有主清单属性 2 1 分析问题 在打包构建的jar目录内 xff0c 可以看到有一个MANIFEST MF文件 xff0c 如图所示 xff
  • VMWare虚拟机扩展磁盘空间(扩充root根目录空间)

    1 扩展虚拟机磁盘空间 Vm虚拟机下Linux扩展原有磁盘空间 xff0c 10G 10G的基础上不能满足需求 xff0c 只好进行磁盘扩展 调整到合适的磁盘空间 需注意以下几点 xff1a linux只能扩展磁盘容量而不能减小 xff0c
  • vim批量操作技巧

    vim批量操作技巧 目录 vim批量操作技巧一 列操作二 批量复制与删除三 批量替换四 批量注释 一 列操作 删除列 在正常模式下 xff08 一般按Esc键就是 xff09 光标定位 CTRL 43 v 进入 VISUAL BLOCK 可
  • VMware17pro图解安装 Rocky Linux 9.1

    1 引言 Rocky Linux为CentOS Linux 的继承者 RHEL 9 的复制品 下面是在VMware上安装实例 1 1 下载安装VMware VMware下载 xff1a VMware官网下载 1 2 下载Rocky9 x镜像
  • (二)Proxmox7.3 VE 安装Rocky9.1系统

    1 准备环境 PVE虚拟管理平台能正常访问 https IP 8006 由于我的服务器磁盘空间不足4G了 xff0c 这里我就安装个debian虚拟机来演示吧 xff0c 毕竟它小巧不占用地方 xff0c 主要是想记录好pve创建虚拟机的步
  • No Spring Session store is configured: set the 'spring.session.store-type'

    发现session store type使用来存放session的存储方式 xff0c 目前Spring boot中只支持Redis方式 由于本应用暂无需将session放入redis的需求 xff0c 故这里就可以将session sto
  • idea修改git账号及密码的方法

    IDEA修改git账号及密码的方法 xff1a 1 file gt settings gt passwords 这里写图片描述 默认In KeePass 保存密码 切换到Do not save forget password after r
  • KETTLE使用教程

    1 Kettle的下载与安装 kettle的最新下载地址 xff1a http community pentaho com projects data integration 由于Kettle 是采用java 编写 xff0c 因此需要在本
  • Hive lag()与lead() 函数

    lag与lead函数是跟偏移量相关的两个分析函数 xff0c 通过这两个函数可以在一次查询中取出同一字段的前N行的数据 lag 和后N行的数据 lead 作为独立的列 从而更方便地进行进行数据过滤 这种操作可以代替表的自联接 xff0c 并
  • WebService简单案例实例

    本周工作日即将结束 xff0c 下周项目经理安排了一项任务可能需要使用到webservice xff0c 但本人之前尚未使用过 xff0c 网上查了一些案例看了看 在此小记一篇留作日后回首也希望可以帮助到查看者朋友 1 什么是WebServ
  • Java中CountDownLatch介绍与应用

    正如每个Java文档所描述的那样 xff0c CountDownLatch是一个同步工具类 xff0c 它允许一个或多个线程一直等待 xff0c 直到其他线程的操作执行完后再执行 在Java并发中 xff0c countdownlatch的