Java使用线程池批量处理数据操作具体流程

 更新时间:2023年06月26日 10:06:49   作者:咕噜咕噜虎  
这篇文章主要给大家介绍了关于Java使用线程池批量处理数据操作的相关资料,Java多线程编程中线程池是一个非常重要的概念,线程池可以提高线程的复用率和任务调度的效率,尤其是当需要查询大批量数据时,需要的朋友可以参考下

疑问&思路:

1.如何保证数据按顺序批量处理

2.如何保证数据全部处理完统一返回

3.如何保证是多任务异步操作

4.如何提高运行效率,减少运行时间

1.使用ArrayList 插入数据有序且可重复

2.CountDownLatch / Future / CompletableFuture

3.多线程

4.线程池创建多线程

具体流程:

  • 获取需要进行批量更新的大集合oldList,对大集合进行拆分操作,分成N个小集合nweList-1 ~ nweList-N 。
  • 开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。
  • 对流程进行控制,控制线程执行顺序。

创建List分割工具类:

public class ListSplitUtils {
    //这里使用泛型T 接收  做到通用工具类
    //resList总数据List  subListLength:需要切割的长度
    public static <T> List<List<T>> split(List<T> resList, int subListLength) {  
        if (CollectionUtils.isEmpty(resList) || subListLength <= 0) {
            return Lists.newArrayList();
        }
        List<List<T>> ret = Lists.newArrayList();
        int size = resList.size();
        if (size <= subListLength) {  //指定数据过小直接处理
            ret.add(resList);
        } else {
            int n = size / subListLength;
            int last = size % subListLength;
            // 分成n个集合,每个大小都是 subListLength 个元素
            for (int i = 0; i < n; i++) {
                List<T> itemList = Lists.newArrayList();
                for (int j = 0; j < subListLength; j++) {
                    itemList.add(resList.get(i * subListLength + j));
                }
                ret.add(itemList);
            }
            // last的进行处理
            if (last > 0) {
                List<T> itemList = Lists.newArrayList();
                for (int i = 0; i < last; i++) {
                    itemList.add(resList.get(n* subListLength + i));
                }
                ret.add(itemList);
            }
        }
        return ret;
    }

创建线程池:

// 初始化线程池
/**
* corePoolSize: 一直保持的线程的数量,即使线程空闲也不会释放。除非设置了 allowCoreThreadTimeout 为 true;
* maxPoolSize:允许最大的线程数,队列满时开启新线程直到等于该值;
* keepAliveTime:表示空闲线程的存活时间。当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程中的线程数不大于corepoolSIze;
* TimeUnitunit:表示keepAliveTime的单位;
* workQueue:缓存任务的队列;
* handler:表示当 workQueue 已满,且池中的线程数达到 maxPoolSize 时,线程池拒绝添加新任务时采取的策略。
*/
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 50, 4, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.AbortPolicy());
        //大集合拆分成N个小集合,保证多线程异步执行, 过大容易回到单线程
        List<List<CheckRecordDetailsDanger>> splitNList = ListSplitUtils.split(CheckRecordDetailsDangerPage, 100); //先设置100  100以内不考虑性能
        // 记录单个任务的执行次数
        CountDownLatch countDownLatch = new CountDownLatch(splitNList.size());
        for (List<CheckRecordDetailsDanger> singleList : splitNList) {
            // 线程池执行
            threadPool.execute(new Thread(() -> {
                for (CheckRecordDetailsDanger checkRecordDetailsDanger : singleList) {
                    //统一赋值方法
                    //unifySetData(checkRecordDetailsDanger);  这是我的方法,需要替换成自己的处理逻辑
                    countDownLatch.countDown();
                }
            }));
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

后话

学习过程中可以了解一下 CountDownLatch 和 Future 以及 ThreadPoolExecutor 。

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

相关文章

  • Spring装配Bean之用Java代码安装配置bean详解

    Spring装配Bean之用Java代码安装配置bean详解

    这篇文章主要给大家介绍了关于Spring装配Bean之用Java代码安装配置bean的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-10-10
  • Java的Spring框架中实现发送邮件功能的核心代码示例

    Java的Spring框架中实现发送邮件功能的核心代码示例

    这篇文章主要介绍了Java的Spring框架中实现发送邮件功能的核心代码示例,包括发送带附件的邮件功能的实现,需要的朋友可以参考下
    2016-03-03
  • spring boot 下支付宝的开箱既用环境

    spring boot 下支付宝的开箱既用环境

    这篇文章主要介绍了spring boot 下支付宝的开箱既用环境包括使用场景和使用技巧,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10
  • Java基础知识之StringReader流的使用

    Java基础知识之StringReader流的使用

    这篇文章主要介绍了Java基础知识之StringReader流的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java读取csv文件内容示例代码

    java读取csv文件内容示例代码

    这篇文章主要介绍了java读取csv文件内容的示例,大家参考使用
    2013-12-12
  • 关于Java中String类字符串的解析

    关于Java中String类字符串的解析

    这篇文章主要介绍有关Java中String类字符串的解析,在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面就进入主题一起学习下面文章内容吧
    2021-10-10
  • Java实现线程按序交替执行的方法详解

    Java实现线程按序交替执行的方法详解

    这篇文章主要为大家详细介绍了Java如何实现线程按序交替执行,文中的示例代码讲解详细,对我们了解线程有一定帮助,需要的可以参考一下
    2022-10-10
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Mybatis逆向生成使用扩展类的实例代码详解

    Mybatis逆向生成使用扩展类的实例代码详解

    这篇文章主要介绍了Mybatis逆向生成使用扩展类的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • java用扑克牌计算24点

    java用扑克牌计算24点

    这篇文章主要为大家详细介绍了java实现24点扑克牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论