CompletableFuture常用方法介绍
时间: 2025-04-15 09:16:20 浏览: 21
<think>好的,用户想了解CompletableFuture的常用方法及使用示例。我需要根据提供的引用内容来整理这些方法,并给出对应的示例。首先,我应该先确认用户提供的引用内容里提到的哪些方法,然后按照逻辑顺序组织这些方法,确保每个方法都有清晰的说明和示例代码。
首先,用户提供的引用中提到了thenCombine、allOf、get()方法、thenAccept等。可能需要将这些方法分门别类,比如创建异步任务、结果处理、组合多个Future、异常处理等。不过根据引用内容,可能重点放在常用的方法如thenCombine、allOf、thenAccept以及异步执行和阻塞获取结果的方法上。
接下来,我需要确保每个方法的说明准确,并引用对应的引用来源。例如,thenCombine方法用于合并两个CompletableFuture的结果,这在引用[1]中提到了。然后allOf方法在引用[1]和可能的其他引用中有示例。get()方法在引用[2]和[3]中有说明,需要注意阻塞的问题以及添加超时的建议。thenAccept方法在引用[4]中详细说明了消费结果的用法。
然后,我需要生成相关的示例代码,确保代码符合Java语法,并正确展示每个方法的使用场景。例如,thenCombine的示例可能需要两个CompletableFuture,然后合并它们的结果。allOf的示例需要展示如何等待多个Future完成。对于thenAccept,需要展示如何处理前一个阶段的结果。
另外,用户可能对异步执行的方法感兴趣,比如supplyAsync和runAsync,这在引用[2]中提到了静态方法用于异步执行。需要补充这些创建阶段的常用方法。
还需要注意异常处理的方法,比如exceptionally,但用户提供的引用中没有提到,但作为常用方法可能需要简要提及,或者如果引用中没有相关内容,可能不包含。不过根据用户提供的引用,可能需要专注于提到的那些方法。
最后,生成相关问题的时候,要围绕CompletableFuture的其他方法、性能优化、应用场景等,比如如何处理异常、如何组合多个Future的不同方式,或者比较不同方法的区别等。
需要确保回答结构清晰,分点列出每个方法,每个方法都有说明、示例和对应的引用标注。同时,示例代码要正确,并符合Java语法,特别是涉及lambda表达式和CompletableFuture链式调用的部分。
可能还需要注意用户提到的使用中文回答,所以所有的说明和示例注释都要用中文。另外,注意使用正确的LaTeX格式,但根据用户的问题,可能数学公式较少,主要是在代码块和文本说明上。
现在开始组织内容,先介绍CompletableFuture的基本用途,然后分点列出常用方法,每个方法下给出说明和示例代码,并标注引用来源。最后生成相关问题。</think>### CompletableFuture常用方法及使用示例
#### 一、创建异步任务
1. **supplyAsync**
用于创建带返回值的异步任务,默认使用`ForkJoinPool`执行。
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "异步任务结果";
});
System.out.println(future.get()); // 输出:异步任务结果
```
2. **runAsync**
用于执行无返回值的异步任务。
```java
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("执行无返回值的任务");
});
future.get(); // 等待任务完成
```
---
#### 二、结果处理
1. **thenApply**
对前序任务结果进行同步转换。
```java
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10)
.thenApply(result -> result * 2);
System.out.println(future.get()); // 输出:20
```
2. **thenAccept**
消费前序任务结果,无返回值。
```java
CompletableFuture.supplyAsync(() -> "Hello")
.thenAccept(result -> System.out.println("消费结果:" + result)); // 输出:消费结果:Hello
```
引用自结果消费方法[^4]。
3. **exceptionally**
捕获异常并返回默认值。
```java
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("模拟异常");
}).exceptionally(ex -> {
System.out.println("捕获异常:" + ex.getMessage());
return 0;
});
System.out.println(future.get()); // 输出:0
```
---
#### 三、组合多个任务
1. **thenCombine**
合并两个独立任务的结果。
```java
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<String> combined = future1.thenCombine(future2, (a, b) -> a + " " + b);
System.out.println(combined.get()); // 输出:Hello World
```
引用自结果合并场景[^1]。
2. **allOf**
等待多个任务全部完成。
```java
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Task1");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Task2");
CompletableFuture<Void> all = CompletableFuture.allOf(future1, future2);
all.get(); // 阻塞直到所有任务完成
System.out.println(future1.get() + ", " + future2.get()); // 输出:Task1, Task2
```
引用自多任务合并方法[^1]。
---
#### 四、阻塞获取结果
使用`get()`方法时需注意阻塞问题,建议添加超时:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Data");
String result = future.get(5, TimeUnit.SECONDS); // 添加超时避免无限阻塞
```
引用自阻塞获取结果的注意事项[^3]。
---
#### 五、线程池配置
指定自定义线程池避免资源竞争:
```java
ExecutorService executor = Executors.newFixedThreadPool(2);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "使用自定义线程池";
}, executor);
```
---
阅读全文
相关推荐


















