【Java 并发编程】CountDownLatch 简介

简介: 【Java 并发编程】CountDownLatch 简介

文章目录

I CountDownLatch 概念

II CountDownLatch 使用流程

III CountDownLatch API 简介



I CountDownLatch 概念


1. 概念 : CountDownLatch ( 倒计时锁 ) 是 Java 并发编程中重要的 线程同步辅助工具类 , 其与 join 方法功能类似 , 其可以阻塞住一个或多个线程 , 等待在某些线程中执行想用的操作 , 将 CountDownLatch 倒计时计数到 0 时 , 这些被阻塞的线程才能继续向下执行 ;


2. 作用 : CountDownLatch 可以将一个或多个线程阻塞 , 并在另外一个或多个线程中将 CountDownLatch 计数器减为 0 , 被阻塞的线程解除休眠状态 , 继续执行 ;




II CountDownLatch 使用流程


1. 初始化 CountDownLatch : 初始化 new CountDownLatch ( 8 ) , 在构造函数中 , 为其指定一个初始值 , 从这个值开始倒计时计数 ; 这里设置了 8 计数 , 可以等待另外 8 个线程执行完毕后 , 在执行后续操作 ;


2. 阻塞 : 在若干线程 ( 一个或多个 ) 中调用同一个 CountDownLatch 对象的 await() 方法 , 即可将这些线程阻塞 ;


3. 计数减一 : 在其它非阻塞的线程中 , 执行操作 , 之后调用 CountDownLatch 对象的 countDown() 方法 , 该计数器的计数会减一 , 如果计数减到 0 , 在线程中的阻塞就会解除 ;


4. 阻塞结束 : 当调用 countDown 计数减到 0 之后 , 线程阻塞解除 , 继续执行 await() 方法之后的代码 ;




III CountDownLatch API 简介


1. 构造方法 : 初始化 CountDownLatch 对象 , 传入计数器初始计数 count , 其可以表示阻塞 count 个线程 ;


① 函数原型 :

public CountDownLatch(int count)


② 参数 int count : 初始计数 ;

2. 计数器递减方法 : 每次调用该方法 , CountDownLatch 对象计数器就会减一 , 如果计数器计数减到 0 , 就会解除其对于线程的阻塞 ;


① 函数原型 :

public void countDown()


② 当前计数大于 0 : 计数 - 1 , 如果减一后的计数为 0 , 那么该 CountDownLatch 对象阻塞的线程就会从阻塞处开始执行 ;

③ 桑倩计数等于 0 : 如果 CountDownLatch 对象的当前的计数是 0 , 那么不作任何操作 ;

3. 无参阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 之后该阻塞解除 ;


① 函数原型 :

public void await() throws InterruptedException


② 计数为 0 : 如果当前的 CountDownLatch 计数为 0 , 那么阻塞无效 , 继续执行之后的代码 ;

③ 计数大于 0 : 此时调用 await 方法 的线程阻塞 , 处于休眠状态 ;

④ 线程非运行状态 : 如果调用 await 方法的线程处于中断状态 , 或者在等待时被中断 , 抛出 InterruptedException 异常 ;

4. 带参数的阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 ( 计数 0 ) 或者超出了等待时间 ( 超时 ) 之后该阻塞解除 ; 该方法运行机制与无参类似 , 这里重点说明超时等待机制 ;


① 函数原型 :

public void await(long timeout, TimeUnit unit) throws InterruptedException


② 参数 long timeout : 阻塞操作要等待的最长时间 ;

③ 参数 TimeUnit unit : 等待时长的单位 , 一般是毫秒 ( ms ) ;


目录
相关文章
|
1天前
|
存储 安全 Java
Java并发编程中的高效数据结构:ConcurrentHashMap解析
【4月更文挑战第25天】在多线程环境下,高效的数据访问和管理是至关重要的。Java提供了多种并发集合来处理这种情境,其中ConcurrentHashMap是最广泛使用的一个。本文将深入分析ConcurrentHashMap的内部工作原理、性能特点以及它如何在保证线程安全的同时提供高并发性,最后将展示其在实际开发中的应用示例。
|
2天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
2天前
|
Java API 调度
[AIGC] 深入理解Java并发编程:从入门到进阶
[AIGC] 深入理解Java并发编程:从入门到进阶
|
2天前
|
前端开发 Java 测试技术
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
|
2天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
IDE Java 开发工具
Java从入门到精通:1.3.1实践编程巩固基础知识
Java从入门到精通:1.3.1实践编程巩固基础知识
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
6天前
|
并行计算 Java 编译器
Java Lambda表达式简介
Java Lambda表达式简介
12 0