Java多线程同步工具类CountDownLatch怎么使用
来源:亿速云
时间:2024-04-01 12:12:42 171浏览 收藏
哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Java多线程同步工具类CountDownLatch怎么使用》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!
简介
CountDownLatch
是一个多线程同步工具类,在多线程环境中它允许多个线程处于等待状态,直到前面的线程执行结束。从类名上看CountDown
既是数量递减的意思,我们可以把它理解为计数器。
核心方法
countDown()
:计数器递减方法。await()
:使调用此方法的线程进入等待状态,直到计数器计数为0时主线程才会被唤醒。await(long, TimeUnit)
:在await()
方法的基础上增加了超时策略,若等待超时仍未有结果则会直接唤醒主线程运行。
CountDownLatch如何使用
在这里我们用一段简单的代码进行演示:
@Slf4j public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(() -> { log.info("hello this is thread one"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } countDownLatch.countDown(); }).start(); new Thread(() -> { log.info("hello this is thread two"); countDownLatch.countDown(); }).start(); new Thread(() -> { log.info("hello this is thread three"); countDownLatch.countDown(); }).start(); countDownLatch.await(); log.info("say good bye!"); } }
由上面的代码可见,我们创建了一个CountDownLatch
计数器为3和三个线程同步运行。在main主线程中调用了countDownLatch.await()
方法使主线程进入阻塞。其中三个线程任务执行完毕后都会调用countDownLatch.countDown()
方法对计数器进行递减,当三个线程任务都执行完毕后计数器计数值为0时主线程被唤醒。
注:在创建
CountDownLatch
实例时必须定义计数器值,一般相对较合理的用法是该值的定义需要经过合理的计算使计数值与需要并行的线程数相等,在每个线程执行完成后做计数递减,最终唤醒主线程继续执行。
CountDownLatch
计数值设置大于线程数,那么最终所有线程都执行完了,而计数为递减到0那么主线程将会一直处于等待状态。CountDownLatch
计数值设置小于并发线程数,那么可能在部分线程未执行完毕时,计数就已经递减到0,则主线程会被提前唤醒。
CountDownLatch运行流程
如下图,主线程阻塞与唤醒的核心就是计数器,只有当所有线程执行完成计数逐个递减最终才会唤起await()
阻塞中的主线程。
注:
await()
可以阻塞一个线程,也可以阻塞多个线程,如果是阻塞多个线程,那么在计数为0时将会唤醒所有被阻塞的线程。
运用场景
在简单了解完CountDownLatch
的作用后,相信各位最终目的还是想了解如何去使用,在哪些场景下使用更加合适,接下来我就拿一个对账业务的场景详细分析一下。
相信现在很多平台都会对接银联、微信、支付宝等支付渠道做交易,那么在这样的场景下对账是不可避免的。对账通常都会在每日的凌晨去处理,一方面是凌晨时间点多数平台访问量都会较小,服务器压力也比较轻松,而且此时出账也比较合理,所以在这个时间点做对账也是一个大数据量计算的操作。
上面讲这么多好像都没说到重点,在处理对账之前首先我们肯定是需要通过各个支付渠道获取对账单文件,那么该如何操作呢?
对账文件下载(第一阶段):在这种情况下可以设计三个任务并发去获取对账文件,使用
CountDownLatch
阻塞主线程,等待三个任务都获取到文件的时候做计数递减,最终唤醒主线将标记本阶段处理完成,并发起进入下一阶段的通知。对账文件解析(第二阶段):在上个阶段已下载完成的文件文件中,此阶段要做的就是解析文件。由于三个渠道都是不同的厂家那么文件的内容格式肯定都是不一样的,这时候我们又可以使用
CountDownLatch
启动三个线程分别去解析各自的对账文件,最终将文件内容转换为业务所需的数据统一格式入库,在三个任务都入库完成后主线程又被唤醒标记完成后,通知下一阶段开始进入工作。对账结算(第三阶段):在上一阶段的数据入库完成后,此阶段要做的就是比对每一笔交易是否准确,一般都是按单号与交易渠道比对交易的金额是否一致,如果金额一致则该笔交易结算成功,否则将交易判定为异常交易,并入库处理。由上面的流程分析我们就可以设计相对合理的
CountDownLatch
计数,结合Semaphore
信号量控制并发量同时对对比交易单做并发处理,最终带所有交易单处理完成后唤醒主线程标记对账完成,并通知下一阶段进行出账。出账(第四阶段):通常平台在对账完成后会进行出账,也就是按照平台的业务规则出具相关的账单方便财务人员进行统计。
理论要掌握,实操不能落!以上关于《Java多线程同步工具类CountDownLatch怎么使用》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
272 收藏
-
230 收藏
-
266 收藏
-
487 收藏
-
289 收藏
-
115 收藏
-
440 收藏
-
231 收藏
-
213 收藏
-
348 收藏
-
381 收藏
-
405 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习