CompletableFuture的方法
时间: 2025-06-11 21:34:46 浏览: 17
### CompletableFuture方法与多线程实现方式
#### 1. 创建异步任务
`CompletableFuture`提供了多种方法来创建异步任务,包括无返回值的任务和有返回值的任务。
- 使用`runAsync`创建一个无返回值的异步任务:
```java
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("执行无返回值的异步任务");
});
```
- 使用`supplyAsync`创建一个有返回值的异步任务[^1]:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "执行有返回值的异步任务";
});
```
#### 2. 异步任务的结果处理
`CompletableFuture`提供了多种方法来处理异步任务的结果,例如`thenApply`、`thenAccept`和`thenRun`等。
- `thenApply`:对结果进行转换并返回新的`CompletableFuture`[^3]:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World");
```
- `thenAccept`:消费结果但不返回新值:
```java
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenAccept(System.out::println);
```
- `thenRun`:在任务完成后执行一个无参数的操作:
```java
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenRun(() -> System.out.println("任务完成"));
```
#### 3. 多个异步任务的组合
`CompletableFuture`支持通过`allOf`和`anyOf`方法组合多个异步任务。
- `allOf`:等待所有任务完成[^4]:
```java
List<CompletableFuture<?>> futures = Arrays.asList(
CompletableFuture.runAsync(() -> System.out.println("Task 1")),
CompletableFuture.runAsync(() -> System.out.println("Task 2"))
);
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
```
- `anyOf`:等待任意一个任务完成:
```java
CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(
CompletableFuture.supplyAsync(() -> "Result 1"),
CompletableFuture.supplyAsync(() -> "Result 2")
);
```
#### 4. 异常处理
`CompletableFuture`提供了`exceptionally`和`whenComplete`方法来处理异常情况。
- `exceptionally`:处理任务中的异常并返回默认值[^3]:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("任务失败");
}).exceptionally(ex -> "Default Result");
```
- `whenComplete`:无论是否发生异常,都会执行的操作:
```java
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("任务失败");
}).whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("捕获到异常:" + ex.getMessage());
} else {
System.out.println("任务成功:" + result);
}
});
```
#### 5. 超时控制
可以通过`orTimeout`方法为异步任务设置超时时间:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "Result";
}).orTimeout(1, TimeUnit.SECONDS); // 如果超过1秒未完成,则抛出TimeoutException
```
#### 6. 自定义线程池
可以使用自定义线程池来执行异步任务,而不是依赖默认的`ForkJoinPool`[^3]:
```java
ExecutorService executor = Executors.newFixedThreadPool(4);
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("使用自定义线程池执行任务");
}, executor);
```
---
###
阅读全文
相关推荐














