使用JUC下的CountDownLatch异步批量处理数据

文章讲述了在处理大量物流信息时,如何通过SQL查询获取数据,但由于需要调用外部API逐条获取完整信息,导致导出Excel缓慢。为了解决这个问题,采用了多线程异步查询,结合Guava的CountDownLatch进行同步控制,确保所有数据获取完成后进行Excel导出,提高了效率。
摘要由CSDN通过智能技术生成

    前几天有个需求让导出物流的发货信息, 比如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导出工作

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值