多线程技术-CountDownLatch在业务中实践
时间:2022-07-24
本文章向大家介绍多线程技术-CountDownLatch在业务中实践,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
JAVA语言中高级特性肯定离不开多线程技术,而CountDownLatch是一个比较常用的并发工具类,它的作用:同步计数器,当计数器的值减到0时,受到影响的线程将被激活。
本文从将从业务实践中,来讲解CountDownLatch的用法,业务场景是这样的:通过后台系统倒入2W+的Excel表格,然后解析检验落库,在没优化前上传一个2000+的Excel都得100多秒,后来经过分析决定使用线程池+CountDownLatch来优化下这段程序提升了性能。
直接贴代码:
//多线程查询
long startTime2 = System.currentTimeMillis();
CountDownLatch cdl = new CountDownLatch(dates.size());
for(Map<Integer, String> data:dates){
Future<?> submit = executor.submit(new Runnable() {
@Override
public void run() {
try {
Detail Detail = buildTransDetail(data);
Detail detail = detailService.queryByChannelAndTransOrderId2(Detail.getChannel(), Detail.getId());
if (null == detail){
DetailContext.getUnSave().add(Detail);
} else {
Detail.setUpdateTime(new Date());
DetailContext.getUnUpdate().add(Detail);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
cdl.countDown();
}
}
});
}
try {
//保证线程池中的所有的线程任务都完成后,主线程才会继续向下执行;
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
这段程序主要是通过线程池去跑一个List的任务,然后使用CountDownLatch阻塞主线程,每个任务执行countDown()方法时cdl的数值都会减1,最终所有List任务都完成后,CountDownLatch的数值会减到0,await()方法阻塞结束,被阻塞主线程拿到List任务的处理结果,然后开始执行后续落库的逻辑,这只是一个简单的应用,好在是结合在业务中使用,大家有什么问题可以一起讨论。
- WeApp-Workflow: 基于Gulp 的微信小程序前端开发工作流
- 如何安装Windows Phone SDK 7.1 Release Candidate (RC)
- 微信与支付宝回应央行新规:认同央行规范!
- Gulp 工作流中Sass 增量编译功能的探索
- Sass与Compass——回顾
- 苹果就“降速门”致歉;央行批扫码支付不正当竞争;王健林旗下公司遭集体裁员
- 姚期智教授:量子计算是千亿万亿级别的产业,或成为科技创新的引擎
- Powershell中禁止执行脚本解决办法
- 使用AsyncTask异步更新UI界面及原理分析
- 商家为何要做小程序?
- Android中关于dip和px以及转换的总结
- Python介绍
- python案例-用户登录
- 推荐个找代码示例的VS 插件 All-In-One Code Framework Sample Browser
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android空心圆及层叠效果实现代码
- 如何更改Dialog的标题与按钮颜色详解
- Android编程之数据库的创建方法详解
- android studio集成ijkplayer的示例代码
- Android开发实现浏览器全屏显示功能
- Android动态人脸检测的示例代码(脸数可调)
- Android抽奖轮盘的制作方法
- Android 获取屏幕的多种宽高信息的示例代码
- Android编程实现禁止StatusBar下拉的方法
- Android自定义view圆并随手指移动
- Android仿微信发送语音消息的功能及示例代码
- 详解Android studio ndk配置cmake开发native C
- Android编程实现禁止状态栏下拉的方法详解
- Android进度条ProgressBar的实现代码
- Android画画板的制作方法