当前位置:网站首页>看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
2022-08-02 11:50:00 【InfoQ】
优化背景

//检测是否存在未对账订单
checkOrders = checkOrders();
while(checkOrders != null){
//查询未校对的订单信息
hasNoOrders = getHasNoOrders();
//查询未校对的库存记录
hasNoStock = getHasNoStock();
//校对数据并返回结果
checkResult = checkData(hasNoOrders, hasNoStock);
//将结果信息保存到数据校对信息表中
saveCheckResult(checkResult);
//检测是否存在未对账订单
checkOrders = checkOrders();
}问题分析


解决方案
//检测是否存在未对账订单
checkOrders = checkOrders();
while(checkOrders != null){
Thread t1 = new Thread(()->{
//查询未校对的订单信息
hasNoOrders = getHasNoOrders();
});
t1.start();
Thread t2 = new Thread(()->{
//查询未校对的库存记录
hasNoStock = getHasNoStock();
});
t2.start();
//阻塞主线程,等待线程t1和线程t2执行完毕
t1.join();
t2.join();
//校对数据并返回结果
checkResult = checkData(hasNoOrders, hasNoStock);
//将结果信息保存到数据校对信息表中
saveCheckResult(checkResult);
//检测是否存在未对账订单
checkOrders = checkOrders();
}进一步优化
遇到新的问题
//检测是否存在未对账订单
checkOrders = checkOrders();
//创建线程池
Executor executor = Executors.newFixedThreadPool(2);
while(checkOrders != null){
executor.execute(()->{
//查询未校对的订单信息
hasNoOrders = getHasNoOrders();
});
executor.execute(()->{
//查询未校对的库存记录
hasNoStock = getHasNoStock();
});
/**如何知道子线程中的getHasNoOrders()方法和getHasNoStock()方法执行完了成为关键**/
//校对数据并返回结果
checkResult = checkData(hasNoOrders, hasNoStock);
//将结果信息保存到数据校对信息表中
saveCheckResult(checkResult);
//检测是否存在未对账订单
checkOrders = checkOrders();
}新的解决方案
//检测是否存在未对账订单
checkOrders = checkOrders();
//创建线程池
Executor executor = Executors.newFixedThreadPool(2);
while(checkOrders != null){
CountDownLatch latch = new CountDownLatch(2);
executor.execute(()->{
//查询未校对的订单信息
hasNoOrders = getHasNoOrders();
latch.countDown();
});
executor.execute(()->{
//查询未校对的库存记录
hasNoStock = getHasNoStock();
latch.countDown();
});
//等待子线程的逻辑执行完毕
latch.await();
//校对数据并返回结果
checkResult = checkData(hasNoOrders, hasNoStock);
//将结果信息保存到数据校对信息表中
saveCheckResult(checkResult);
//检测是否存在未对账订单
checkOrders = checkOrders();
}总结与思考

边栏推荐
猜你喜欢

字母交换--字符串dp

Likou 35 - search for insertion position - binary search

AQS-AbstractQueuedSynchronizer

Thymeleaf

DTG-SSOD:最新半监督检测框架,Dense Teacher(附论文下载)

Getting Started with Three.JS Programmatic Modeling

FinClip | 来了, 2022 年 7 月更新大盘点

Crack detection technology based on deep learning

如何通过DBeaver 连接 TDengine?

力扣27-移除元素——简单题
随机推荐
go源码之sync.Waitgroup
ansible模块--yum模块
When not to use () instead of Void in Swift
QT笔记——Q_PROPERTY了解
Crack detection technology based on deep learning
Oracle降低高水位
云原生(三十) | Kubernetes篇之应用商店-Helm介绍
SQL function $TRANSLATE
如何在 UE4 中制作一扇自动开启的大门
C#为listview选中的项添加右键菜单
excel 批量翻译-excel 批量函数公司翻译大全免费
JSP中如何正确的填写include指令中的file路径呢?
8大软件供应链攻击事件概述
力扣977-有序数组的平方——暴力法&双指针法
【kali-信息收集】(1.9)Metasploit+搜索引擎工具Shodan
doc2vec和word2vec(zigbee简介及应用)
redis cluster cluster, the ultimate solution?
今日睡眠质量记录85分
ASP.NET Core 6框架揭秘实例演示[31]:路由“高阶”用法
Learning Experience Sharing Seven: YOLOv5 Code Chinese Comments