前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程技术-CountDownLatch在业务中实践

多线程技术-CountDownLatch在业务中实践

作者头像
别明天就今天吧
发布2020-09-07 01:25:44
4810
发布2020-09-07 01:25:44
举报
文章被收录于专栏:别明天就今天吧

JAVA语言中高级特性肯定离不开多线程技术,而CountDownLatch是一个比较常用的并发工具类,它的作用:同步计数器,当计数器的值减到0时,受到影响的线程将被激活。

本文从将从业务实践中,来讲解CountDownLatch的用法,业务场景是这样的:通过后台系统倒入2W+的Excel表格,然后解析检验落库,在没优化前上传一个2000+的Excel都得100多秒,后来经过分析决定使用线程池+CountDownLatch来优化下这段程序提升了性能。

直接贴代码:

代码语言:javascript
复制
//多线程查询
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任务的处理结果,然后开始执行后续落库的逻辑,这只是一个简单的应用,好在是结合在业务中使用,大家有什么问题可以一起讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 别明天就今天吧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档