首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CompletableFuture异步编程【四】

CompletableFuture异步编程【四】

作者头像
贺公子之数据科学与艺术
发布2025-12-18 08:32:16
发布2025-12-18 08:32:16
1360
举报

CompletableFuture异步编程

基本概念

CompletableFuture是Java 8引入的一个强大的异步编程工具,它实现了Future和CompletionStage接口,提供了丰富的API来支持异步操作和函数式编程。相比传统的Future,CompletableFuture具有以下优势:

  • 可以手动完成Future(设置返回值或异常)
  • 支持链式调用和组合多个异步操作
  • 提供了异常处理机制
  • 支持回调函数
  • 可以与Java 8的Stream API和Lambda表达式无缝配合

核心方法

创建CompletableFuture

静态工厂方法

代码语言:javascript
复制
// 创建一个已完成的CompletableFuture
CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Hello");

// 创建一个异步执行的CompletableFuture
CompletableFuture<Void> runAsyncFuture = CompletableFuture.runAsync(() -> {
    // 无返回值的异步任务
});

CompletableFuture<String> supplyAsyncFuture = CompletableFuture.supplyAsync(() -> {
    // 有返回值的异步任务
    return "Result";
});

自定义Executor

代码语言:javascript
复制
Executor executor = Executors.newFixedThreadPool(10);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 使用自定义线程池执行任务
    return "Custom Executor Result";
}, executor);
结果处理

阻塞获取结果

代码语言:javascript
复制
// 阻塞等待结果
String result = future.get();

// 带超时的阻塞等待
String result = future.get(1, TimeUnit.SECONDS);

非阻塞回调

代码语言:javascript
复制
future.thenAccept(result -> {
    // 处理结果
    System.out.println("Result: " + result);
});

future.thenApply(result -> {
    // 转换结果
    return result.length();
});

future.whenComplete((result, exception) -> {
    // 完成时处理(无论成功或失败)
    if (exception != null) {
        exception.printStackTrace();
    } else {
        System.out.println(result);
    }
});

组合多个Future

顺序组合

代码语言:javascript
复制
CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(s -> s + " World")
    .thenApply(String::toUpperCase)
    .thenAccept(System.out::println);

并行组合

代码语言:javascript
复制
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2)
       .thenAccept(System.out::println);

多任务组合

代码语言:javascript
复制
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.thenRun(() -> {
    // 所有任务完成后执行
});

CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2, future3);
anyFuture.thenAccept(result -> {
    // 任一任务完成后执行
});

异常处理

显式处理

代码语言:javascript
复制
future.exceptionally(ex -> {
    System.out.println("Exception occurred: " + ex.getMessage());
    return "default value";
});

链式处理

代码语言:javascript
复制
future.handle((result, ex) -> {
    if (ex != null) {
        return "recovery value";
    }
    return result;
});

实际应用场景

并行调用多个服务

代码语言:javascript
复制
CompletableFuture<User> userFuture = CompletableFuture.supplyAsync(() -> userService.getUser(userId));
CompletableFuture<Order> orderFuture = CompletableFuture.supplyAsync(() -> orderService.getOrder(orderId));

userFuture.thenCombine(orderFuture, (user, order) -> {
    // 合并用户和订单信息
    return new UserOrder(user, order);
}).thenAccept(this::processUserOrder);

异步流水线处理

代码语言:javascript
复制
CompletableFuture.supplyAsync(() -> fetchDataFromRemote())
    .thenApply(data -> transformData(data))
    .thenApply(transformedData -> saveToDatabase(transformedData))
    .thenRun(() -> sendNotification())
    .exceptionally(ex -> {
        log.error("Pipeline failed", ex);
        return null;
    });

超时处理

代码语言:javascript
复制
CompletableFuture.supplyAsync(() -> {
        try {
            Thread.sleep(2000);
            return "Result";
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    })
    .completeOnTimeout("Timeout Result", 1, TimeUnit.SECONDS)
    .thenAccept(System.out::println);

最佳实践

  1. 合理使用线程池:避免使用默认的ForkJoinPool,根据业务特点配置合适的线程池
  2. 避免阻塞操作:尽量使用回调而非阻塞获取结果
  3. 注意异常传播:确保异常被适当处理,避免静默失败
  4. 资源清理:使用whenComplete或handle确保资源被释放
  5. 性能监控:监控CompletableFuture的执行时间和完成率

高级特性

  1. 依赖注入:可以将CompletableFuture作为方法参数或返回值,实现更灵活的依赖关系
  2. 响应式编程:与Reactive Streams结合使用,构建响应式系统
  3. 自定义CompletionStage:实现自己的CompletionStage扩展功能

CompletableFuture为Java开发者提供了一套完整的异步编程解决方案,熟练掌握它可以显著提高应用程序的并发性能和响应能力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CompletableFuture异步编程
    • 基本概念
    • 核心方法
      • 创建CompletableFuture
      • 结果处理
    • 组合多个Future
    • 异常处理
    • 实际应用场景
    • 最佳实践
    • 高级特性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档