当前位置: 代码网 > it编程>编程语言>Java > java使用CompletableFuture分批处理任务实现

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

2024年07月26日 Java 我要评论
一、无返回值任务函数// 数据分批list<list<statisticsdto>> batches = lists.partition(statisticslist, bat

一、无返回值任务函数

// 数据分批
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分批处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com