Java开发中 CompletableFuture 的使用指南

在现代 Java 开发中,异步编程越来越重要。尤其是在处理耗时任务、并行计算或高并发场景下,传统的 ThreadExecutorService 往往显得繁琐且不易维护。Java 8 引入的 CompletableFuture 提供了一种强大、灵活的异步编程方式,极大简化了异步任务的处理。

本文将带你全面了解 CompletableFuture 的使用方法,包括基本用法、组合操作、异常处理以及实际开发中的应用场景。


1. CompletableFuture 基本概念

CompletableFuture 是 Java 8 引入的一个异步任务工具类,它实现了 Future 接口,并提供了丰富的 API 支持异步任务的组合、回调和异常处理。

特点:

  • 支持异步执行

  • 支持任务之间的组合(串行、并行)

  • 支持异常处理

  • 支持回调(成功/失败后的处理)

基本创建方式有两种:

  1. 异步执行无返回值的任务:

    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        System.out.println("异步执行任务");
    });
    
  2. 异步执行有返回值的任务:

    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. 实际应用场景

    1. 异步接口调用:同时请求多个微服务,合并结果。

    2. 异步数据处理:批量计算、数据转换。

    3. 提高系统吞吐量:非阻塞处理,提高响应速度。

    4. 复杂业务逻辑组合:使用 thenCombineallOf 等组合多个异步任务。


    5. 总结

    CompletableFuture 是 Java 异步编程的利器,它提供了:

    • 简单直观的异步任务创建方式

    • 丰富的回调、任务组合、异常处理 API

    • 可自定义线程池、控制并发

    在高并发、微服务或大数据处理场景下,合理使用 CompletableFuture 可以极大提高系统性能和代码可读性。

    Logo

    Agent 垂直技术社区,欢迎活跃、内容共建。

    更多推荐