CodeArena

使用CompletableFuture进行异步任务编排

2023-04-13
Java
最后更新:2024-05-23
3分钟
590字

使用CompletableFuture进行异步任务编排

Java8引入了一个新特性:CompletableFuture,让异步任务的编排变得更简单了。

CompletableFuture可以指定异步处理流程:

  • thenAccept()处理正常结果;
  • exceptional()处理异常结果;
  • thenApplyAsync()用于串行化另一个CompletableFuture
  • anyOf()allOf()用于并行化多个CompletableFuture

场景:假设你正在开发一个天气应用,用户可以输入多个城市名,应用会同时向多个天气API发送请求,然后将结果合并并展示给用户。

使用CompletableFuture,你可以并行地发送这些请求并等待它们的完成,然后将结果进行合并。

1
public static void main(String[] args) {
2
List<String> cities = Arrays.asList("Beijing", "London", "NewYork");
3
4
List<CompletableFuture<String>> futures = cities.stream()
5
.map(city -> CompletableFuture.supplyAsync(() -> getWeather(city)))
6
.collect(Collectors.toList());
7
8
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
9
10
CompletableFuture<List<String>> combinedFuture = allFutures.thenApplyAsync(v -> futures.stream()
11
.map(CompletableFuture::join)
12
.collect(Collectors.toList()));
13
14
try {
15
List<String> weatherList = combinedFuture.get();
9 collapsed lines
16
System.out.println(weatherList);
17
} catch (InterruptedException | ExecutionException e) {
18
throw new RuntimeException(e);
19
}
20
}
21
22
private static String getWeather(String city) {
23
return "weather in " + city;
24
}

CompletableFuture是一个Future的实现类,它允许你以函数式的方式处理异步操作的结果。

CompletableFuture的主要特点包括:

  1. 异步执行:可以使用CompletableFuture来执行耗时的操作,而不会阻塞主线程。而使用Future.get方法是会阻塞主线程的

  2. 链式操作:可以将多个CompletableFuture链接在一起,形成一个操作流,每个操作都可以依赖前一个操作的结果。

  3. 异常处理:可以使用exceptionally()方法来处理异常情况,或者使用handle()方法来处理正常结果和异常情况。

  4. 组合操作:可以使用**thenCompose()**方法将多个CompletableFuture组合成一个CompletableFuture,以便更灵活地处理结果。

  5. 并行执行:可以使用**allOf()、anyOf()**等方法来并行执行多个CompletableFuture。

以下是一些CompletableFuture的常用方法:

  1. supplyAsync():以异步方式执行一个任务,并返回一个CompletableFuture。

  2. thenApply():对CompletableFuture的结果应用一个函数,返回一个新的CompletableFuture。

  3. thenAccept():对CompletableFuture的结果应用一个消费者函数,不返回结果。

  4. thenRun():在CompletableFuture完成后执行一个Runnable任务。

  5. thenCompose():将多个CompletableFuture组合成一个CompletableFuture。

  6. exceptionally():处理CompletableFuture的异常情况。

  7. handle():处理CompletableFuture的正常结果和异常情况。

  8. allOf():并行执行多个CompletableFuture,并在所有CompletableFuture完成后返回一个CompletableFuture。

  9. anyOf():并行执行多个CompletableFuture,并在任意一个CompletableFuture完成后返回一个CompletableFuture。

本文标题:使用CompletableFuture进行异步任务编排
文章作者:Echoidf
发布时间:2023-04-13
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode