前几天有个需求让导出物流的发货信息, 比如2023年1月1日之后的

sql查了下数据量比较大, 而且需要sql查询到的数据中的一些参数, 调用外部api接口才能获取到完成的数据

由于外部api只能依次调用, 每次只能查询一条数据, 导致excel的导出非常缓慢, 最后考虑使用多线程异步查询外部api, 汇总数据, 最后做excel导出

考虑到需要做数据汇总, 使用CountDownLatch最合适

CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。

CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。

1. 首先查询要统计的物流信息

Lists.partition 是 guava 提供的工具类, 目的在于把一个很长的集合, 拆分多多个小集合, 比如我这里是把 itemList 做拆分, 每一个小集合的长度是 50, 之后 创建一个拥有 50 个计数器的 CountDownLatch, 计数器的数量一定要是拆分后集合的数量, 不然会丢数据

 2. 多线程执行

循环外层集合, 会循环50次, 每一次循环取到里面的小集合, 也就是真正要处理的业务数据, 然后开启一个线程调用第三方api接口, 每一个小集合处理完毕, 千万要记住在 finally 里把 计数器做 减一操作

3. 等待所有线程执行完毕

使用 countDownLatch的 await() 方法, 等待所有线程执行完毕, 也就是 计数器 为0, 从源码的角度看就是 state 这个字段是不是0, 如果不放心, 可以传递等待超时时间

4. excel导出

等所有线程执行完毕, 做excel导出工作

使用JUC下的CountDownLatch异步批量处理数据相关推荐

  1. ajax实现向上正在加载,向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  2. vue el-checkbox按下shift键实现批量选择数据

    目录 1.先看下效果 2.代码分析 1.添加html代码,先将列表写出来 2.初始化数据:给原数据添加index属性 3.设置一个flag记录是否按下了shift键,通过监听键盘按下和松开给flag赋 ...

  3. JUC下的CountDownLatch,CyclicBarrier、Semaphore的使用方法

    countDownLatch是在 java1.5 被引入,跟它一起被引入的工具类还有 CyclicBarrier.Semaphore.concurrentHashMap 和 BlockingQueue ...

  4. Linux下redis 以关键字批量删除数据

    删除以某些key(info)开头得数据,总结了一下: 环境配置: CentOS-6,redis-3.2.8,双机主备集群 192.168.149.212:7018,7019,7020:(master) ...

  5. SharePoint 实现ajax异步加载数据的几种方式

    初到公司,由原想的asp.net开发转向了SharePoint(简称SP)开发,个人感觉与之前差别不大,今天用sp实现异步加载数据的时候遇到点问题,之前在asp.net下一步都是用 jquery.aj ...

  6. excel批量导入数据

    这个功能也是我以前项目中经常用到的,感觉很实用,必须拿来分享下: excel进行批量导入数据,结合struts2+ajax 导入的视图:batchAdd.ftl(视图无关紧要的,可以换成其他任何视图, ...

  7. 几分钟教你批量重命名文件,批量更改数据的方法

    批量更改数据的方法有很多,今天为您介绍的是使用Renamer这款专门为批量重命名文件而设计的一款工具,使用Renamer可以批量重命名文件,还可以批量更改文件的数据,操作简单,可快速地同时更改多个文件 ...

  8. 【重难点】【JUC 02】volitale 常用模式 、JUC 下有哪些内容 、并发工具类

    [重难点][JUC 02]volitale 常用模式 .JUC 下有哪些内容 .并发工具类 文章目录 [重难点][JUC 02]volitale 常用模式 .JUC 下有哪些内容 .并发工具类 一.v ...

  9. libusb linux 异步传输,使用libusb异步批量传输,设备停止接收,如果我们空闲

    我正在写一个Linux程序(使用Qt 4.8和libusb 1.0),它将与自定义USB设备(当前正在由同事编程)进行通信.使用libusb异步批量传输,设备停止接收,如果我们空闲 第1步是让&quo ...

最新文章

  1. XML DOM – 属性和方法概述
  2. BackboneFast
  3. 在windows环境下基于sublime text3的node.js开发环境搭建
  4. Win2000中活动目录的备份与恢复
  5. ArrayList笔记
  6. Nginx + PHP CGI的fix_pathinfo安全漏洞
  7. [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-iSCSI篇
  8. 牛客 - 排序(模拟)
  9. .Net Core 2.1 通用主机(Core 在控制台应用程序中的应用)
  10. red hat 4.1.2_安装Red Hat Container Development Kit 2.2版本
  11. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第32篇]基于博弈的证明和基于模拟的证明
  12. HDU1253 胜利大逃亡
  13. 小小的起步VMware vSphere之二
  14. 百度08年网页搜索份额73.2% 创历史新高
  15. java调用chrome内核_selenium中如何测试360等基于chrome内核的浏览器
  16. js链接oracle数据库语法,js连接oracle数据库
  17. 厦门高考成绩查询2021,2021厦门市地区高考成绩排名查询,厦门市高考各高中成绩喜报榜单...
  18. Computer vision: models, learning and inference 学习笔记1:引言
  19. 导数的四则运算法则_导数、微分、积分之间的区别与联系
  20. CCF CSP 201609-2 火车购票(C++语言100分)[简单模拟题]

热门文章

  1. 读书笔记 ——《系统程序员成长计划》篇6:写的又快又好的秘诀
  2. 最短路多起点多终点(超级源点)
  3. 小马哥spring编程核心思想_小马哥讲Spring核心编程思想
  4. 如何解决`三维地图联系microsoft 必应地图服务时遇到错误,功能可能受限制(状态代码:4)`
  5. 2020低压电工考试题及低压电工实操考试视频
  6. 2021年高压电工试题及解析及高压电工实操考试视频
  7. 有没有好用的UI在线设计工具?这5个设计师必备!
  8. 鱼和熊掌可兼得,高定制+低成本的知识管理系统
  9. jQuery自适应栅格式左右滑动轮播卡片式table
  10. 2023,“蔚小理”真的经不起更多“事故”了