Java 异步与并发编程:CompletableFuture 使用技巧
·
Java开发中 CompletableFuture 的使用指南
在现代 Java 开发中,异步编程越来越重要。尤其是在处理耗时任务、并行计算或高并发场景下,传统的 Thread 或 ExecutorService 往往显得繁琐且不易维护。Java 8 引入的 CompletableFuture 提供了一种强大、灵活的异步编程方式,极大简化了异步任务的处理。
本文将带你全面了解 CompletableFuture 的使用方法,包括基本用法、组合操作、异常处理以及实际开发中的应用场景。
1. CompletableFuture 基本概念
CompletableFuture 是 Java 8 引入的一个异步任务工具类,它实现了 Future 接口,并提供了丰富的 API 支持异步任务的组合、回调和异常处理。
特点:
-
支持异步执行
-
支持任务之间的组合(串行、并行)
-
支持异常处理
-
支持回调(成功/失败后的处理)
基本创建方式有两种:
-
异步执行无返回值的任务:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { System.out.println("异步执行任务"); }); -
异步执行有返回值的任务:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { return 100; });
2. 常用方法与使用示例
2.1 异步执行任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello CompletableFuture";
});
System.out.println(future.get()); // 阻塞等待结果
2.2 任务完成后的回调
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World") // 对结果进行转换
.thenAccept(System.out::println); // 输出最终结果
2.3 任务组合
串行组合
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 2)
.thenApply(n -> n * 2)
.thenApply(n -> n + 3);
System.out.println(future.get()); // 输出 7
并行组合
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 2);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 3);
CompletableFuture<Integer> result = future1.thenCombine(future2, (a, b) -> a + b);
System.out.println(result.get()); // 输出 5
2.4 异常处理
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("出错啦");
return 1;
}).exceptionally(ex -> {
System.out.println("捕获异常:" + ex.getMessage());
return 0;
});
System.out.println(future.get()); // 输出 0
3. 高级用法
3.1 allOf / anyOf
-
allOf:等待所有任务完成
CompletableFuture<Void> all = CompletableFuture.allOf(
CompletableFuture.runAsync(() -> doTask("任务1")),
CompletableFuture.runAsync(() -> doTask("任务2"))
);
all.join();
System.out.println("所有任务完成");
-
anyOf:任意任务完成即可
CompletableFuture<Object> any = CompletableFuture.anyOf(
CompletableFuture.supplyAsync(() -> "任务1完成"),
CompletableFuture.supplyAsync(() -> "任务2完成")
);
System.out.println(any.get()); // 输出最先完成的任务结果
3.2 自定义线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
return 10;
}, executor);
System.out.println(future.get());
executor.shutdown();
4. 实际应用场景
-
异步接口调用:同时请求多个微服务,合并结果。
-
异步数据处理:批量计算、数据转换。
-
提高系统吞吐量:非阻塞处理,提高响应速度。
-
复杂业务逻辑组合:使用
thenCombine、allOf等组合多个异步任务。
5. 总结
CompletableFuture 是 Java 异步编程的利器,它提供了:
-
简单直观的异步任务创建方式
-
丰富的回调、任务组合、异常处理 API
-
可自定义线程池、控制并发
在高并发、微服务或大数据处理场景下,合理使用 CompletableFuture 可以极大提高系统性能和代码可读性。
更多推荐
所有评论(0)