应用场景
- 异步计算:当某个操作不需要立即获取结果,且希望主线程不被阻塞时,可使用 CompletableFuture 进行异步计算。例如在一个电商系统中,计算商品的推荐列表,这个过程可能比较耗时,使用 CompletableFuture 可以在后台线程进行计算,主线程继续处理其他请求。
- 并行处理:多个独立的任务可以并行执行,然后合并结果。比如在数据分析场景下,从多个数据源获取数据并进行分析,每个数据源的获取操作可并行执行,最后合并分析结果。
- 依赖关系处理:任务之间存在依赖关系时,CompletableFuture 可以方便地处理。例如先进行用户认证,认证通过后再获取用户的详细信息。
示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 异步计算示例
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 42;
});
// 获取异步计算结果
Integer result = future.get();
System.out.println("异步计算结果: " + result);
// 并行处理示例
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (a, b) -> a + b);
Integer combinedResult = combinedFuture.get();
System.out.println("并行处理合并结果: " + combinedResult);
// 依赖关系处理示例
CompletableFuture<Boolean> authFuture = CompletableFuture.supplyAsync(() -> {
// 模拟认证操作
return true;
});
CompletableFuture<String> userInfoFuture = authFuture.thenApplyAsync(auth -> {
if (auth) {
return "用户详细信息";
} else {
return "认证失败,无法获取信息";
}
});
String userInfo = userInfoFuture.get();
System.out.println("依赖关系处理结果: " + userInfo);
}
}