Java 用 CompletableFuture 实现批量任务异步处理:从代码解析到最佳实践
在实际开发中,我们经常需要处理批量任务(如批量数据同步、批量订单处理等),如果采用串行方式处理,效率会非常低下。本文将通过一段基于 CompletableFuture 的批量任务异步处理代码,详细解析如何利用 Java 异步编程能力提升批量任务处理效率,并分享实践中的优化要点。
一、业务场景与代码功能
假设我们有一个批量任务处理场景:需要对一批数据(每条数据包含唯一标识 id)进行异步处理,要求:
- 每条数据独立异步执行,互不阻塞;
- 记录每条数据的处理结果(成功/失败);
- 所有任务完成后,触发通知逻辑(如发送邮件、消息);
- 保证线程安全,避免并发问题。
下面是实现该场景的核心代码,我们将逐行解析其设计思路与技术细节:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 基于 CompletableFuture 的批量任务异步处理器
*/
public class BatchTaskProcessor {
/**
* 批量处理任务
* @param taskMapList 待处理的任务列表(每条任务是一个包含"id"的Map)
*/
public void processTickets(List<Map<String,String>> taskMapList) {
// 记录每条任务的处理结果(key: 任务id,value: 处理结果)
HashMap<String, Boolean> resultMap = new HashMap<>();
// 原子计数器:跟踪已完成的任务数量(线程安全)
AtomicInteger completedTasks = new AtomicInteger(0);
// 存储所有异步任务的CompletableFuture,用于后续等待所有任务完成
List<CompletableFuture<Void>> futures = new ArrayList<>();
// 自定义线程池:固定10个线程(根据任务量调整)
ExecutorService taskExecutor = Executors.newFixedThreadPool(10);
// 遍历任务列表,为每条任务创建异步处理逻辑
for (Map<String,String> task : taskMapList) {
// 用runAsync创建无返回值的异步任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try {
// 打印当前处理的任务id(便于日志跟踪)
String taskId = task.get("id");
System.out.printf("开始处理任务,id: %s%n", taskId);
// 用于记录任务执行日志
StringBuilder msg = new StringBuilder();
boolean isSuccess;
// 单独捕获每条任务的执行异常
try {
// 执行核心任务逻辑(具体业务由executeTask实现)
isSuccess =

最低0.47元/天 解锁文章
1103

被折叠的 条评论
为什么被折叠?



