需求:系统接口比较慢,有的接口会通过许多数据库io或者网络io需一些数据,如果接口内这部分请求都是串行的会比较浪费时间,咱们这里可以做并行请求
一 CompletableFuture的介绍
CompletableFuture
是Java 8引入的一个新特性,是一种用于异步编程的工具类。它可以用于处理异步任务,例如网络请求、文件读写、数据库查询等等,使得这些任务可以并发执行并在完成时得到通知。
CompletableFuture
的原理主要是基于Java的Future模式和函数式编程思想。它封装了一个异步操作,并在操作完成后返回一个Future对象
,可以通过该对象获取异步操作的结果。在异步操作完成之前,可以执行一些其他的操作,这些操作可以是同步的,也可以是异步的。
CompletableFuture
具有以下特点:
- 可以链式调用:通过调用
thenApply()
、thenAccept()
和thenRun()
等方法,可以将多个异步操作链接在一起。 - 支持异常处理:可以使用
exceptionally()
和handle()
等方法处理异步操作抛出的异常。 - 支持合并操作:可以使用
thenCombine()
、thenCompose()
和allOf()
等方法合并多个异步操作的结果。 - 支持异步执行:可以使用
CompletableFuture.supplyAsync()
、CompletableFuture.runAsync()
等方法来执行异步操作。
在实现上,CompletableFuture
使用了Java的线程池来实现异步执行,它可以在任务完成时通知等待该结果的线程。当CompletableFuture
的结果被设置时,它会通知所有等待该结果的线程,使得它们可以继续执行。
总之,CompletableFuture
提供了一种方便的异步编程方式,它通过利用Java的Future模式和函数式编程思想来实现。它可以帮助我们更加简单和高效地处理异步任务,提高代码的可读性和可维护性。
二 使用
当使用 CompletableFuture
时,我们通常需要执行以下步骤:
- 创建一个
CompletableFuture
对象。 - 执行一个异步操作,可以使用
CompletableFuture.supplyAsync()
或CompletableFuture.runAsync()
方法。 - 调用
thenApply()
、thenAccept()
或thenRun()
等方法,将操作链起来。 - 调用
join()
方法获取异步操作的结果。
下面是一些常见的 CompletableFuture
使用场景及示例代码:
- 异步执行任务并获取结果:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行任务
return "hello world";
});
String result = future.join();
System.out.println(result);
- 顺序执行多个异步任务:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行任务1
return "hello";
}).thenApplyAsync((String s) -> {
// 异步执行任务2,依赖于任务1的结果
return s " world";
}).thenApplyAsync((String s) -> {
// 异步执行任务3,依赖于任务2的结果
return s.toUpperCase();
});
String result = future.join();
System.out.println(result);
- 并发执行多个异步任务并等待结果:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
// 异步执行任务1
return "hello";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
// 异步执行任务2
return "world";
});
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
// 异步执行任务3
return "!";
});
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.join();
System.out.println(future1.join() " " future2.join() future3.join());
- 处理异步任务抛出的异常:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行任务
throw new RuntimeException("error");
}).exceptionally((Throwable t) -> {
// 处理异常
return "default";
});
String result = future.join();
System.out.println(result);
- 串行执行多个异步任务:
CompletableFuture<String> future = CompletableFuture.completedFuture("hello")
.thenComposeAsync((String s) -> {
// 异步执行任务2,依赖于任务1的结果
return CompletableFuture.completedFuture(s " world");
})
.thenComposeAsync((String s) -> {
// 异步执行任务3,依赖于任务2的结果
return CompletableFuture.completedFuture(s.toUpperCase());
});
String result = future.join();
System.out.println(result);
上述示例代码只是 CompletableFuture
的一些常规使用场景,实际上 CompletableFuture
可以支持更加复杂的场景,如链式调用、合并操作等。