多线程——CompletableFuture.allOf()使用方法

CompletableFuture.allOf()使用方法

CompletableFuture.allOf是Java 8中CompletableFuture类的一个静态方法,它允许你等待多个CompletableFuture全部完成。下面我将详细介绍如何使用它。

基本用法

CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2, future3);

allOf方法接受一个CompletableFuture数组或可变参数,返回一个新的CompletableFuture,当所有给定的CompletableFuture都完成时,这个新的CompletableFuture也会完成。

完整示例

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class AllOfExample {
    public static void main(String[] args) {
        // 创建多个CompletableFuture
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "结果1";
        });
        
        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "结果2");
        CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "结果3";
        });
        
        // 使用allOf等待所有future完成
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
        
        try {
            // 阻塞直到所有future完成
            allFutures.get();
            
            // 现在可以安全地获取各个future的结果
            System.out.println(future1.get()); // 输出: 结果1
            System.out.println(future2.get()); // 输出: 结果2
            System.out.println(future3.get()); // 输出: 结果3
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

获取所有结果

allOf本身不提供结果聚合,它只是等待所有future完成。如果你想收集所有结果,可以这样做:

CompletableFuture<List<String>> allResults = CompletableFuture.allOf(future1, future2, future3)
    .thenApply(v -> {
        return Stream.of(future1, future2, future3)
                    .map(CompletableFuture::join)
                    .collect(Collectors.toList());
    });

List<String> results = allResults.get(); // ["结果1", "结果2", "结果3"]

异常处理

如果任何一个future异常完成,allOf返回的future也会异常完成:

CompletableFuture.allOf(future1, future2, future3)
    .exceptionally(ex -> {
        System.out.println("有一个future失败了: " + ex.getMessage());
        return null;
    });

与anyOf的区别

  • allOf: 等待所有future完成
  • anyOf: 等待任意一个future完成

实际应用场景

  • 并行执行多个独立任务,等所有任务完成后再继续
  • 聚合来自多个微服务的数据
  • 批量处理异步操作
### 使用 CompletableFuture 实现多线程环境中的事务管理 在 Java 中,`CompletableFuture` 提供了一种灵活的方式来组合异步操作并处理它们之间的依赖关系。为了确保多个 `CompletableFuture` 调用作为一个整体成功完成或全部回滚,在多线程环境中实现事务管理的最佳实践如下: #### 1. 组合多个 CompletableFutures 并等待所有结果 通过收集所有的 `CompletableFuture<Void>` 到列表中,并最终调用 `allOf()` 方法来创建一个新的 `CompletableFuture` 对象,该对象将在所有给定的 completable futures 完成后完成。 ```java import java.util.List; import java.util.concurrent.CompletableFuture; public class TransactionManager { public static void executeTransaction(List<Runnable> tasks) throws Exception { List<CompletableFuture<Void>> futures = tasks.stream() .map(task -> CompletableFuture.runAsync(task)) .toList(); try { // Wait for all futures to complete. CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); } catch (Exception e) { throw new RuntimeException("Transaction failed", e); } } } ``` 这种方法允许在一个地方捕获任何异常,并决定如何响应失败的任务——无论是抛出异常还是尝试补偿措施[^2]。 #### 2. 添加错误恢复机制 当某个阶段发生错误时,可以通过定义 `.exceptionally()` 或者更复杂的链式回调来进行补救工作。这有助于保持系统的稳定性和一致性状态。 ```java // Example of adding error handling with exceptionally(). futures.forEach(cf -> cf.exceptionally(ex -> { System.err.println("Error occurred during task execution: " + ex.getMessage()); return null; // or some default value depending on your use case }) ); ``` 对于需要更强一致性的场景,则应考虑引入分布式事务协调器或其他形式的日志记录/持久化方案以支持幂等性操作[^3]。 #### 3. 使用虚拟线程优化性能 如果应用程序涉及大量并发任务,可以利用 JDK 21 引入的新特性——虚拟线程(Project Loom)。相比于传统的固定大小线程池,虚拟线程提供了更好的资源利用率和更低的上下文切换开销。不过需要注意的是,由于每个任务都会启动独立的轻量级线程实例,因此应当谨慎评估潜在的内存占用情况以及是否有必要实施额外的对象缓存策略[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值