需求:系统接口比较慢,有的接口会通过许多数据库io或者网络io需一些数据,如果接口内这部分请求都是串行的会比较浪费时间,咱们这里可以做并行请求
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 可以支持更加复杂的场景,如链式调用、合并操作等。