线程池异步处理
List<CompletableFuture<Void>> futures = new ArrayList<>();// 提交10个异步任务
for (int i = 0; i < 10; i++) {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {insertData(batchData); // 每个任务插入一批数据}, pool).thenAccept();futures.add(future); // 将Future对象存入列表
}// 等待所有任务完成
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
通过CompletableFuture
或回调函数,调用线程无需等待任务完成,实现真正的异步
Future
ExecutorService pool = Executors.newFixedThreadPool(2);
List<CompletableFuture<Void>> futures = new ArrayList<>();for (int i = 1; i <= 3; i++) {int taskId = i;CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {Thread.sleep(1000);return "Result-" + taskId;}, pool).thenAccept(result -> {System.out.println("[Callback] Task " + taskId + " => " + result);});futures.add(future); // 保存Future对象
}// 等待所有任务完成(阻塞主线程)
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
pool.shutdown();
System.out.println("所有任务完成!");
没有future会咋样?
(1) 主线程不会等待任务完成
(2) 无法统一处理任务状态
-
失去的能力:
-
无法通过
CompletableFuture.allOf()
等待所有任务完成。 -
无法统计成功/失败的任务数量。
-
无法集中处理异常(如记录失败日志或重试)
Q:我都要主线程等待了,为啥还用异步,直接用普通线程池不就行了
使用 异步任务(如 CompletableFuture
)+ 主线程等待 相比 普通线程池阻塞等待,在以下场景中具有显著优势:
-
灵活组合任务:可轻松实现“任务并行→结果聚合”的流程(如
allOf
/anyOf
)。 -
非阻塞回调:即使主线程等待,仍能通过回调处理中间结果(如进度更新)。