基于CompletableFuture的用法及说明

 更新时间:2026年06月09日 15:01:33   作者:后会无期77  
这段文章详细介绍了CompletableFuture的核心特性,包括异步执行与回调、任务组合与异常处理,并提供了常用方法示例,CompletableFuture适用于复杂异步流程的处理,提升系统性能,通过合理使用,可实现高效并行计算与微服务调用

CompletableFuture 概述

CompletableFuture 是 Java 8 引入的异步编程工具,属于 java.util.concurrent 包。

它扩展了 Future 接口,支持非阻塞操作、链式调用和组合多个异步任务,简化了复杂异步流程的处理。

核心特性

1.异步执行与回调

  • 通过 supplyAsyncrunAsync 启动异步任务。
  • 使用 thenApplythenAccept 等方法注册回调。
​
CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(s -> s + " World")
    .thenAccept(System.out::println);
​

2.任务组合

thenCompose:串联两个依赖的异步任务。

  • thenCombine:合并两个独立任务的结果。
​
CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> "A");
CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> "B");
futureA.thenCombine(futureB, (a, b) -> a + b)
    .thenAccept(System.out::println);
​

3.异常处理

  • exceptionally:捕获异常并返回默认值。
  • handle:无论成功或失败均执行处理逻辑。
​
CompletableFuture.supplyAsync(() -> 1 / 0)
    .exceptionally(ex -> 0)
    .thenAccept(System.out::println); // 输出 0
​

常用方法

1.创建异步任务

  • supplyAsync(Supplier<U>):返回结果的异步任务。
  • runAsync(Runnable):无返回值的异步任务。

2.结果处理

  • thenApply(Function<T,U>):对结果转换。
  • thenAccept(Consumer<T>):消费结果。

3.多任务协作

  • allOf(CompletableFuture<?>...):等待所有任务完成。
  • anyOf(CompletableFuture<?>...):任一任务完成即返回。

示例代码

// 模拟异步获取用户信息
CompletableFuture<String> fetchUser = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "User123";
});

// 异步获取订单信息
CompletableFuture<String> fetchOrder = CompletableFuture.supplyAsync(() -> "Order456");

// 合并结果
fetchUser.thenCombine(fetchOrder, (user, order) -> user + " - " + order)
    .thenAccept(System.out::println); // 输出 "User123 - Order456"

注意事项

  • 线程池管理:默认使用 ForkJoinPool.commonPool(),可通过重载方法指定自定义线程池。
  • 避免阻塞get() 方法会阻塞线程,推荐使用回调或 join()(仅在明确需要时使用)。
  • 异常传播:未处理的异常会导致任务静默失败,需显式捕获。

CompletableFuture 适用于需要编排多个异步操作的场景,如微服务调用、并行计算等,能显著提升系统的响应速度和资源利用率。

批量执行

 ExecutorService executor = Executors.newFixedThreadPool(2);
        List<User> userList = new ArrayList<>();
        for(int i = 0;i< 5;i++){
            userList.add(new User((100+i)+"","test"+i));
        }

        List<CompletableFuture<ERUser>> completableFutureList = userList.stream().map(user->CompletableFuture.supplyAsync(()->{
            ERUser erUser  = new ERUser();
            erUser.setName(user.getUserName());
            log.info("线程id:"+Thread.currentThread().getName()+",user转ERUser"+ user.getUserName());
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return erUser;
        },executor).exceptionally( ex->{
            //异常捕获
            return null;
        })).collect(Collectors.toList());

        List<ERUser> erUsers = completableFutureList.stream()
                .map(CompletableFuture::join)
                .collect(Collectors.toList());
        executor.shutdown();
        log.info(erUsers.size()+"");

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • django 递归查询评论的示例详解

    django 递归查询评论的示例详解

    文章介绍了将表数据转换为树状结构以及如何处理扁平化数据的方法,探讨了在数据管理中的应用和实现技术,感兴趣的朋友一起看看吧
    2025-01-01
  • Java一维二维数组的使用方法详解(Arrays类方法)

    Java一维二维数组的使用方法详解(Arrays类方法)

    这篇文章主要给大家介绍了关于Java一维二维数组使用方法的相关资料,数组是相同类型元素的集合,可以通过索引访问元素,文章还讨论了数组的遍历、排序、查找等操作,并提供了相关示例代码,需要的朋友可以参考下
    2025-05-05
  • 详解HandlerInterceptor处理器拦截器的用法

    详解HandlerInterceptor处理器拦截器的用法

    这篇文章主要介绍了HandlerInterceptor处理器拦截器的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java项目中统计代码耗时的工具类

    Java项目中统计代码耗时的工具类

    相信大家在实际工具中,经常需要做性能分析,做性能分析就少不了代码执行的耗时分析,本文将使用Java编写一个项目统计代码耗时的工具类,希望对大家有所帮助
    2025-08-08
  • Java集合框架之Collection接口详解

    Java集合框架之Collection接口详解

    这篇文章主要为大家详细介绍了Java集合框架之Collection接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Spring MVC 响应处理页面、数据与状态配置的方法

    Spring MVC 响应处理页面、数据与状态配置的方法

    本文给大家介绍Spring MVC 响应处理页面、数据与状态配置的相关知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • Springboot转发重定向实现方式解析

    Springboot转发重定向实现方式解析

    这篇文章主要介绍了springboot转发重定向实现方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot访问windows共享文件的方法

    SpringBoot访问windows共享文件的方法

    这篇文章主要介绍了SpringBoot访问windows共享文件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • java实现的xml格式化实现代码

    java实现的xml格式化实现代码

    这篇文章主要介绍了java实现的xml格式化实现代码,需要的朋友可以参考下
    2016-11-11
  • Java多线程实现快速切分文件的程序

    Java多线程实现快速切分文件的程序

    这篇文章主要为大家详细介绍了Java多线程实现快速切分文件的相关资料,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论