当前位置:网站首页>看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
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();
}
总结与思考

边栏推荐
- QAbstractScrollArea、QScrollArea
- OLED的HAL库代码介绍及使用(stm32f1/I2C/HAL库版/100%一次点亮)
- Shell编程之条件语句
- yolo格式(txt)数据集转VOC(xml)
- AQS-AbstractQueuedSynchronizer
- Metaverse "Drummer" Unity: Crazy expansion, suspense still exists
- ABAP-OOAVL模板程序
- Likou 58 - Left Rotation String
- When not to use () instead of Void in Swift
- Coroutines and Lifecycle in Kotlin
猜你喜欢
[kali-information collection] (1.8) ARP reconnaissance tool _Netdiscover
Create an application operation process using the kubesphere GUI
Shell编程之条件语句
OSI 七层模型和TCP/IP模型及对应协议(详解)
力扣27-移除元素——简单题
[kali-information collection] (1.9) Metasploit + search engine tool Shodan
使用kubesphere图形界面创建一个devops的CI/CD流程
当POC遇见RPA:RPA项目顺利实施的关键
基于深度学习的裂缝检测技术
云原生(三十) | Kubernetes篇之应用商店-Helm介绍
随机推荐
SQL(面试实战07)
Oracle 19c 连接PDB
darknet训练yolov4模型
划分训练集,验证集,测试集
Crack detection technology based on deep learning
ssm web page access database data error
企业级数据治理工作怎么开展?Datahub这样做
excel 批量翻译-excel 批量函数公司翻译大全免费
Shell编程案例
小程序插件让开发者受益的几个理由
【Acunetix-Forgot your password】
openresty 性能优化
力扣704-二分查找
Thymeleaf
运行yum报错Error: Cannot retrieve metalink for reposit
从幻核疑似裁撤看如何保证NFT的安全
Oracle 19c配置ob server
ABAP-OOAVL模板程序
【Acunetix-忘记密码】
Lexicon 27 - Remove Elements - Simple Questions