news 2026/4/25 22:06:10

CountDownLatch简单实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CountDownLatch简单实战

前言:本篇文章系作者本人学习CountDownLatch处理工作问题之心得记录,仅供参考和学习

一、什么问题?

甲方有个需求,需要按照excel中某个字段count,n为值(n可能是小数,负数,正整数),生成n条数据,这个值可能为几十,也可能为几万,最后导致生成的数据会异常庞大,直接处理非常容易出现OOM问题,响应时间过长。

二、解决思路

1、对于大量的数据,不能一次性写入数据库,只能分批写入

2、考虑到n可能为1,避免不必要的计算,便需要分别处理n为正整数,n非正整数的数据

3、写入完成后,需要通知用户,便想到CountDownLatch这个方法可以等所有子线程执行完成后执行主线程。

三、实战(简单代码)

1、拆分数据

// 将excel数据根据count区分正整数和非正整数 List<ExcelBeanEntity> entities = excelListMap.get(true);

2、使用CountDownLatch处理数据

// 创建两个线程写入数据 CountDownLatch latch = new CountDownLatch(2); // 线程1处理非正整数 Thread thread1 = new Thread(() -> { try { // 从map中拿到对应的数据,非正整数无需生成 List<ExcelBeanEntity> entities = listMap.get(false); this.saveBatch(entities); } catch (Exception e) { // 将当前线程的中断标志重新设置为 true。 Thread.currentThread().interrupt(); } finally { // 无论线程如何,必须减1 latch.countDown(); } }); Thread thread2 = new Thread(() -> { try { List<ExcelBeanEntity> entities = listMap.get(true); // 分批写入-每次一千条 int batchSize = 1000; List<ExcelBeanEntity> arrayList = new ArrayList<>(batchSize); for (ExcelBeanEntity entity : entities) { int n = entity.getCount().intValueExact(); for (int i= 1; i<=n;i++){ // 数据量大,避免使用copy,加大开销 ExcelBeanEntityen = new ExcelBeanEntity(); en.setName(entity.getName()); // 此时忽略后续get,set ...... arrayList.add(en); // 执行分批保存 if (arrayList.size() >= batchSize){ this.saveBatch(arrayList,arrayList.size()); arrayList.clear(); } } } // 处理不满足分批保存的剩余数据 if (!CollectionUtils.isEmpty(arrayList)){ this.saveBatch(arrayList); } } catch (Exception e) { Thread.currentThread().interrupt(); } finally { latch.countDown(); } }); // 线程执行 thread1.start(); thread2.start(); // 等待所有子线程执行完成 latch.await();

3、注意点

用的是mysql数据库,需要配置批量写入开启,可以大幅度提升写入数据效率(实测20w+数据从请求到写入数据库30s左右)

rewriteBatchedStatements=true

示例:

spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

四、总结

以前遇到大数据写入,第一想法就是异步写入,写法复杂、阅读性差。后面了解到CountDownLatch,这也算是我的初次在工作中使用,写法简单易懂。如果屏幕前的大佬还有什么好的解决方案,可以放在评论区,指导我一下,供我学习,谢谢各位OG,Bye~。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 22:04:42

OpenBB ODP:金融数据统一平台架构解析与实战指南

1. 从数据孤岛到统一平台&#xff1a;为什么我们需要OpenBB ODP干了这么多年量化分析和数据工程&#xff0c;最头疼的事情是什么&#xff1f;不是模型不够复杂&#xff0c;也不是算力不够强大&#xff0c;而是数据源太散了。你肯定也遇到过&#xff1a;想分析一只股票&#xff…

作者头像 李华
网站建设 2026/4/25 22:00:58

AI 部署别急着买工具!迅易的 3 个会开完再行动

调研显示&#xff0c;74% 的企业 AI 项目以失败告终&#xff0c;不是技术不行&#xff0c;而是 90% 的企业都犯了同一个错&#xff1a;还没对齐战略、没找准场景&#xff0c;就急着买工具、上模型。买了大模型 API、部署了智能平台&#xff0c;结果要么用不起来沦为摆设&#x…

作者头像 李华
网站建设 2026/4/25 21:59:26

Android高级开发工程师:全面职位解析与面试指南

在移动互联网时代,Android开发作为核心技术领域,对高级工程师的需求日益增长。本文将基于提供的职位信息,深入剖析Android高级开发工程师的角色、职责、任职资格,并提供实用的面试问题和答案。全文结构清晰,分为四个主要部分:工作职责详解、任职资格分析、面试问题与答案…

作者头像 李华
网站建设 2026/4/25 21:57:21

【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历

LeetCode 199. 二叉树的右视图 &#x1f4cc; 题目描述 题目级别&#xff1a;中等 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入&#xff1a;root [1,2,3,null,5,…

作者头像 李华