java多线程批量处理百万级的数据方法示例

 更新时间:2025年02月15日 09:30:14   作者:弗拉唐  
这篇文章主要介绍了java多线程批量处理百万级的数据的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用java多线程具有一定的参考借鉴价值,需要的朋友可以参考下

一,对Excel表中两个表数据的读取

创建readSheet方法,参数为所需读取Excel表的路径和索引,这个索引就是在文件中两个表的索引(分别为0和1)

方法步骤:

1.使用字节流读取Excel表,通过getSheetAt(0)方法获取第一个表格,也就是负责人表

2.接着通过getRow()方法获取第一行的数据,也就是表头

3.通过for循环遍历第一行到最后一行的数据,这时候需要一个list集合来接收数据

4.创建一个泛型为Map<String ,String>的List集合接收上面的map数据

5.遍历得到每一行的每一个单元格,也就是每一个值

5.1:headerRow.getCell(cell.getColumnIndex()).getStringCellValue():从表头行(第0行)获取当前单元格对应的列名

5.2: String cellValue = getCellValue(cell);获取单元格的值

5.3:rowMap.put(columnName,cellValue)添加数据到map集合

6.最后把map集合添加到list集合

两个表格,索引对应0和1

二:拆分集合

因为业主信息太多,所以需要进行拆分

步骤:

1.方法中的chunkSize为所拆分的大小,也就是多少条数据为一部分,本条案例用的是1000条数据为一块

2.使用了subList()方法将i从0到改模块大小1000条数据添加到parts列表里面(使用Math.min()方法比较整个表的大小和模块的大小,选择更小的,防止报错)

三:多线程验证拆分的数据,验证数据的项目、楼栋、单元是否存在在第一个集合,这里使用了线程池,最后合并结果

步骤:

1.先使用Executors.newFixedThreadPool 创建一个固定大小的线程池。这里只指明了一个核心线程数量的参数Runtime.getRuntime().availableProcessors()

2.遍历步骤二中拆分到的每一个数据模块,每一个模块都使用submit()方法提交一个任务给线程池

3.遍历每一个模块中的每一行数据row,调用自己创建的existsInFirstSheet()方法来检查数据row是否在负责人(firstSheetData)表格中存在

4.创建一个list列表validData,如果存在就添加到列表中,返回validData

5.创建一个列表futures,将每一个模块的validData数据添加到列表中,最后返回futures

6.existsInFirstSheet()方法:

检查row是否在负责人(firstSheetData)表格中存在

步骤:

1.遍历 firstSheetData 列表中的每一行数据。

2.检查当前行的 "项目"、"楼栋" 和 "单元" 字段是否与 row 的对应字段相等。

3.如果相等,则将 firstSheetRow 中的 "负责人" 字段值赋给 row,并返回 true。

4.如果遍历完所有行都没有找到匹配项,则返回 false

四:将存在的业主信息结果输出到一个新的Excel中,以负责人名称为工作表名称,将对应的业主数据分离到不同的工作表

步骤:

1.先对futures列表进行遍历,然后创建一个mergedData列表,把所有的数据都添加到这个列表中

2.将合并的结果validatedData重新写入另一个Excel表格

步骤:

2.1:遍历合并结果每一行,获取负责人名称,并进行判断是否为null,如果不为null再添加到

新创建的Set集合responsiablePersons中

2.2:遍历负责人集合,每个负责人创建一个表格,同时也需要判断是否为null

2.3:创建的表格以负责人的名字进行命名

2.4:初始化索引为0,遍历Set集合中所有的键,得到表头数据

2.5:再对合并的结果进行遍历,判断负责人与person值是否相同,相同就遍历所有键值对,最后写进Excel表格中

总结 

到此这篇关于java多线程批量处理百万级的数据的文章就介绍到这了,更多相关java批量处理百万级数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中String、StringBuffer、StringBuilder的区别介绍

    Java中String、StringBuffer、StringBuilder的区别介绍

    这篇文章主要介绍了Java中String、StringBuffer、StringBuilder的区别介绍,本文讲解了可变与不可变、是否多线程安全、gBuilder与StringBuffer共同点等内容,需要的朋友可以参考下
    2015-06-06
  • 基于HTTP协议实现简单RPC框架的方法详解

    基于HTTP协议实现简单RPC框架的方法详解

    RPC全名(Remote Procedure Call),翻译过来就是远程过程调用,本文将为大家介绍如何基于HTTP协议实现简单RPC框架,感兴趣的小伙伴可以了解一下
    2023-06-06
  • 使用Mybatis-Plus时的SqlSessionFactory问题及处理

    使用Mybatis-Plus时的SqlSessionFactory问题及处理

    这篇文章主要介绍了使用Mybatis-Plus时的SqlSessionFactory问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot+Vue中的Token续签机制

    SpringBoot+Vue中的Token续签机制

    本文主要介绍了SpringBoot+Vue中的Token续签机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 解决Java Calendar类set()方法的陷阱

    解决Java Calendar类set()方法的陷阱

    这篇文章主要介绍了解决Java Calendar类set()方法的陷阱,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Spring中的AutowireCandidateResolver的具体使用详解

    Spring中的AutowireCandidateResolver的具体使用详解

    这篇文章主要介绍了Spring中的AutowireCandidateResolver的具体使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java多线程事务回滚@Transactional失效处理方案

    Java多线程事务回滚@Transactional失效处理方案

    这篇文章主要介绍了Java多线程事务回滚@Transactional失效处理方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Spring Boot整合持久层之JdbcTemplate多数据源

    Spring Boot整合持久层之JdbcTemplate多数据源

    持久层是JavaEE中访问数据库的核心操作,SpringBoot中对常见的持久层框架都提供了自动化配置,例如JdbcTemplate、JPA 等,MyBatis 的自动化配置则是MyBatis官方提供的。接下来分别向读者介绍Spring Boot整合这持久层技术中的整合JdbcTemplate
    2022-08-08
  • 详解java 中泛型中的类型擦除和桥方法

    详解java 中泛型中的类型擦除和桥方法

    这篇文章主要介绍了详解java 中泛型中的类型擦除和桥方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • spring boot(四)之thymeleaf使用详解

    spring boot(四)之thymeleaf使用详解

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。接下来通过本文给大家介绍spring boot(四)之thymeleaf使用详解,需要的朋友可以参考下
    2017-05-05

最新评论