CompletableFuture 是 Java 8 引入的一个强大的工具,用于编写异步、非阻塞的代码。它实现了 Future 接口,并提供了丰富的 API 来处理异步任务的创建、组合、异常处理等。
强大的异步编程能力
任务创建:通过 runAsync() 和 supplyAsync() 方法,可以轻松创建异步任务。
任务组合:支持任务的串行、并行和依赖执行,例如 thenApply()、thenCombine() 等。
异常处理:提供灵活的异常处理机制,例如 exceptionally()、handle()。
结果合并:支持多个任务的结果合并,例如 allOf()、anyOf()。
简化代码
链式调用:通过链式调用,可以将多个任务串联起来,代码更简洁。
函数式编程:支持 Lambda 表达式,代码更易读。
高性能
非阻塞:任务异步执行,不会阻塞主线程。
并行处理:支持任务的并行执行,充分利用多核 CPU 的性能。
灵活性
自定义线程池:可以通过自定义线程池控制任务的执行环境。
任务拆分:可以将大任务拆分为多个小任务,并行执行,提升性能。
// 使用 Future
ExecutorService executor = Executors.newFixedThreadPool(4);
Future<String> future = executor.submit(() -> "Hello World");
String result = future.get(); // 阻塞
System.out.println(result);
// 使用 CompletableFuture
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello World");
completableFuture.thenAccept(System.out::println); // 非阻塞
// 使用 RxJava
Observable.just("Hello World")
.subscribe(System.out::println);
// 使用 CompletableFuture
CompletableFuture.supplyAsync(() -> "Hello World")
.thenAccept(System.out::println);
// 使用 Project Reactor
Mono.just("Hello World")
.subscribe(System.out::println);
// 使用 CompletableFuture
CompletableFuture.supplyAsync(() -> "Hello World")
.thenAccept(System.out::println);
CompletableFuture.runAsync(Runnable task):执行没有返回值的任务。
CompletableFuture.supplyAsync(Supplier supplier):执行有返回值的任务。
示例:
java
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
System.out.println("任务1执行中...");
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务2执行中...");
return "任务2完成";
});
thenApply():对任务结果进行转换。
thenAccept():消费任务结果。
thenRun():在任务完成后执行操作。
thenCombine():合并两个任务的结果。
示例:
java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + " World")
.thenApply(String::toUpperCase);
System.out.println(future.join()); // 输出: HELLO WORLD
exceptionally():捕获异常并返回默认值。
handle():无论是否发生异常,都会执行。
示例:
java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("任务执行失败");
}).exceptionally(ex -> {
System.out.println("捕获异常: " + ex.getMessage());
return "默认值";
});
System.out.println(future.join()); // 输出: 默认值
allOf():等待所有任务完成。
anyOf():等待任意一个任务完成。
示例:
java
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "任务1完成");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "任务2完成");
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join(); // 等待所有任务完成
在项目中,可以使用 CompletableFuture 执行耗时任务,避免阻塞主线程。
示例:
java
CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "任务完成";
}).thenAccept(result -> System.out.println(result));
通过 thenCompose() 或 thenCombine(),可以管理任务之间的依赖关系。
示例:
java
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = future1.thenCompose(result ->
CompletableFuture.supplyAsync(() -> result + " World")
);
System.out.println(future2.join()); // 输出: Hello World
通过 allOf() 和 join(),可以合并多个任务的结果。
示例:
j
ava
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "任务1完成");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "任务2完成");
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join();
String result1 = future1.join();
String result2 = future2.join();
System.out.println(result1 + ", " + result2); // 输出: 任务1完成, 任务2完成
ExecutorService executor = Executors.newFixedThreadPool(4);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
System.out.println("任务执行中...");
return "任务完成";
}, executor);
executor.shutdown();
- 任务拆分:
将大任务拆分为多个小任务,并行执行,提升性能。
异常处理优化:
使用 handle() 方法,无论是否发生异常,都会执行,避免代码冗余。
结果缓存:
对于重复的计算任务,可以将结果缓存起来,避免重复计算。
CompletableFuture 是 Java 8 提供的一个强大工具,能够显著提升异步编程的效率。其好处和特点包括:
强大的异步编程能力:支持任务创建、组合、异常处理和结果合并。
简化代码:通过链式调用和函数式编程,代码更简洁。
高性能:任务异步执行,不会阻塞主线程。
灵活性:支持自定义线程池和任务拆分。
与其他异步工具相比,CompletableFuture 更轻量级,API 更简单,适合处理简单的异步任务。在实际项目中,结合自定义线程池、任务依赖管理和结果合并,可以进一步优化性能。