java使用CompletableFuture分批处理任务实现

 更新时间:2024年07月26日 08:33:12   作者:呦,又写BUG呢  
本文主要介绍了java使用CompletableFuture分批处理任务实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、无返回值任务函数

// 数据分批
List<List<StatisticsDTO>> batches = Lists.partition(statisticsList, BATCH_SIZE);
List<CompletableFuture<Void>> futures = new ArrayList<>(batches.size());

// 数据处理
for (int i = 0; i < batches.size(); i++) {
    logger.info("批次 " + i + " 开始处理...");
    String logId = LogIdThreadLocal.getLogId();  // 传递主线程的 logId
    List<StatisticsDTO> batchData = batches.get(i);
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        try {
            LogIdThreadLocal.setLogId(logId);
            processBatch(batchData);
        } finally {
            LogIdThreadLocal.clean();
        }
    });
    futures.add(future);
}

// 等待所有的异步任务完成
CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
allOf.join();

二、带返回值任务函数

// 数据分批
List<List<StatisticsDTO>> batches = Lists.partition(statisticsList, BATCH_SIZE);
List<CompletableFuture<List<StatisticsDTO>>> futures = new ArrayList<>(batches.size());

// 数据处理
for (int i = 0; i < batches.size(); i++) {
    logger.info("批次 " + i + " 开始处理...");
    String logId = LogIdThreadLocal.getLogId();  // 传递主线程的 logId
    List<StatisticsDTO> batchData = batches.get(i);
    CompletableFuture<List<DoctorAvatarAnalysisDTO>> future = CompletableFuture.supplyAsync(() -> {
        try {
            LogIdThreadLocal.setLogId(logId);
            return processBatch(batchData);
        } finally {
            LogIdThreadLocal.clean();
        }
    });
    futures.add(future);
}

// 等待所有 CF 完成并合并结果
CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
List<StatisticsDTO> result = allOf.thenApply(
        v -> futures.stream().map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList())
).join();

到此这篇关于java使用CompletableFuture分批处理任务实现的文章就介绍到这了,更多相关java CompletableFuture分批处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot+WebSocket向前端推送消息的实现示例

    SpringBoot+WebSocket向前端推送消息的实现示例

    WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许服务器主动向客户端推送信息,同时也能从客户端接收信息,本文主要介绍了SpringBoot+WebSocket向前端推送消息的实现示例,感兴趣的可以了解一下
    2024-08-08
  • java方法替换word文档中需要替换的部分操作步骤

    java方法替换word文档中需要替换的部分操作步骤

    这篇文章主要介绍了java方法替换word文档中需要替换的部分操作的相关资料,需要的朋友可以参考下,包括引入依赖、创建业务方法、测试以及扩展功能,需要的朋友们可以参考下
    2024-12-12
  • 基于Java设计一个高并发的秒杀系统

    基于Java设计一个高并发的秒杀系统

    这篇文章主要为大家详细介绍了如何基于Java设计一个高并发的秒杀系统,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2023-10-10
  • Java基础知识精通二维数组的应用

    Java基础知识精通二维数组的应用

    为了方便组织各种信息,计算机常将信息以表的形式进行组织,然后再以行和列的形式呈现出来。二维数组的结构决定了其能非常方便地表示计算机中的表,以第一个下标表示元素所在的行,第二个下标表示元素所在的列。下面简单了解一下二维数组,包括数组的声明和初始化
    2022-04-04
  • Java 初识CRM之项目思路解析

    Java 初识CRM之项目思路解析

    本篇文章意在帮助大家了解CRM的一些基本概念,介绍相关业务,后文也将会将基于笔者所在公司的业务详细阐述CRM各模块,感兴趣的朋友快来看看吧
    2021-11-11
  • springboot中使用Hibernate-Validation校验参数详解

    springboot中使用Hibernate-Validation校验参数详解

    这篇文章主要为大家介绍了springboot中使用Hibernate-Validation校验参数详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 一文读懂JavaWeb前后端数据交互

    一文读懂JavaWeb前后端数据交互

    本文主要介绍了一文读懂JavaWeb前后端数据交互,包括HTTP请求与响应、JSON数据格式以及常用的数据传输技术,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java封装类型与基础类型对比示例分析

    java封装类型与基础类型对比示例分析

    这篇文章主要为大家介绍了java封装类型与基础类型对比示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 详细SpringBoot生命周期接口的使用

    详细SpringBoot生命周期接口的使用

    本文主要介绍了SpringBoot生命周期接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • java中进程与线程_三种实现方式总结(必看篇)

    java中进程与线程_三种实现方式总结(必看篇)

    下面小编就为大家带来一篇java中进程与线程_三种实现方式总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论