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中CountDownLatch的用法

    详解Java中CountDownLatch的用法

    这篇文章主要为大家详细介绍了Java中CountDownLatch类的用法,本文通过一些简单的示例进行了简单介绍,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05
  • Java自定义Spring配置标签

    Java自定义Spring配置标签

    这篇文章主要介绍了Java自定义Spring配置标签,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • java对接支付宝支付接口简单步骤记录

    java对接支付宝支付接口简单步骤记录

    最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,这篇文章主要给大家介绍了关于java对接支付宝支付接口的简单步骤,需要的朋友可以参考下
    2024-05-05
  • java中有无参数和返回值的方法详解

    java中有无参数和返回值的方法详解

    这篇文章主要介绍了java中有无参数和返回值的方法详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • RestTemplate如何通过HTTP Basic Auth认证示例说明

    RestTemplate如何通过HTTP Basic Auth认证示例说明

    这篇文章主要为大家介绍了RestTemplate如何通过HTTP Basic Auth认证的示例说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 在idea环境下构建springCloud项目

    在idea环境下构建springCloud项目

    本篇文章主要介绍了在idea环境下构建springCloud项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • AsyncConfigurerSupport自定义异步线程池处理异常

    AsyncConfigurerSupport自定义异步线程池处理异常

    这篇文章主要为大家介绍了AsyncConfigurerSupport自定义异步线程池处理异常详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java实现经典游戏超级玛丽的示例代码

    Java实现经典游戏超级玛丽的示例代码

    在你的童年记忆里,是否有一个蹦跳、顶蘑菇的小人?本文将用java语言实现经典游戏《超级玛丽》,文中采用了swing技术进行了界面化处理,需要的可以参考一下
    2022-02-02
  • java使用@Scheduled注解执行定时任务

    java使用@Scheduled注解执行定时任务

    这篇文章主要给大家介绍了关于java使用@Scheduled注解执行定时任务的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解jvm对象的创建和分配

    详解jvm对象的创建和分配

    这篇文章主要介绍了jvm对象的创建和分配的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03

最新评论