Java 异步回调

🚀 Java 异步回调的两种实现方式详解

在日常开发中,我们经常会遇到这样的场景:

👉 任务提交后不阻塞主线程,任务完成后自动通知调用方

这就是典型的 异步回调模型

本文通过一个「老板-员工」的案例,对比两种实现方式:

  • 基于 Callback 接口(传统方式)
  • 基于 CompletableFuture(推荐方式)

🧩 一、什么是异步回调?

异步回调的核心思想是:

调用方发起任务后不等待结果,而是在任务完成时由执行方主动通知调用方

📌 举个例子:

  • 老板安排任务
  • 员工执行任务(异步)
  • 员工完成后通知老板

🛠 二、基于 Callback 接口实现

1️⃣ 实现思路

流程如下:

  1. 老板调用员工执行任务
  2. 员工开启新线程处理任务
  3. 任务完成后调用回调接口通知老板

2️⃣ 核心代码

java 复制代码
interface Callback {
    void call(String result);
}
java 复制代码
class Boss implements Callback {
    Worker worker;

    public Boss(Worker worker) {
        this.worker = worker;
    }

    @Override
    public void call(String result) {
        System.out.println("【老板】收到结果:" + result);
    }

    public void makeBigDeal() {
        System.out.println("【老板】安排任务...");
        worker.execute("开发文档", this);
        System.out.println("【老板】继续做其他事情...");
    }
}
java 复制代码
class Worker {
    void execute(String work, Callback callback) {
        new Thread(() -> {
            System.out.println("【员工】开始工作:" + work);
            callback.call("code done~");
        }).start();
    }
}

3️⃣ 执行效果

复制代码
【老板】安排任务...
【老板】继续做其他事情...
【员工】开始工作:开发文档
【老板】收到结果:code done~

4️⃣ 优缺点分析

✅ 优点

  • 思想简单,容易理解
  • 贴近底层机制

❌ 缺点

  • 线程手动创建(不可控)
  • 回调嵌套容易变成"回调地狱"
  • 异常处理困难
  • 不利于复杂任务编排

⚡ 三、基于 CompletableFuture 实现(推荐)

1️⃣ 实现思路

CompletableFuture 提供了:

  • 链式调用(thenApply / thenAccept)
  • 异步执行(Async)
  • 多任务组合(allOf)

2️⃣ 核心代码

java 复制代码
@Test
void completableFutureTest() {

    // 老板下发任务
    CompletableFuture<String> workFuture =
            CompletableFuture.supplyAsync(() -> {
                System.out.println("【老板】下发任务");
                return "开发文档";
            });

    // 老板的生活
    CompletableFuture<Void> bossLife =
            CompletableFuture.runAsync(() ->
                    System.out.println("【老板】下班回家奶孩子...")
            );

    // 员工执行 + 回调
    CompletableFuture<Void> result =
            workFuture.thenApplyAsync(work -> {
                        System.out.println("【员工】执行任务:" + work);
                        return "code done~";
                    })
                    .thenAcceptAsync(res ->
                            System.out.println("【老板】收到结果:" + res)
                    );

    CompletableFuture.allOf(result, bossLife).join();
}

3️⃣ 执行流程图(逻辑)

复制代码
老板下发任务 → 员工执行 → 返回结果 → 老板收到结果
         ↓
     老板并行生活

4️⃣ 优势分析

✅ 优点

  • ✔ 链式调用,代码更优雅
  • ✔ 自动线程池(ForkJoinPool)
  • ✔ 支持任务组合(allOf / anyOf)
  • ✔ 内置异常处理(exceptionally)
  • ✔ 非阻塞编程模型

⚖️ 四、两种方式对比

对比维度 Callback CompletableFuture
编程方式 回调函数 链式调用
线程管理 手动创建 线程池
可读性 较差
异常处理 困难 简单
扩展性
推荐程度

💡 五、最佳实践建议

在实际项目中:

👉 不推荐:

java 复制代码
new Thread(...)

👉 推荐:

java 复制代码
CompletableFuture + 线程池

或者:

java 复制代码
ExecutorService + Future

🧠 六、总结

  • Callback 是异步回调的基础模型,本质是事件通知机制
  • CompletableFuture 是对异步编程的高级封装
  • 在现代 Java 开发中:

优先使用 CompletableFuture,而不是手写回调

相关推荐
吃饱了得干活14 小时前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
lwx5728016 小时前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
Flynt18 小时前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
plainGeekDev19 小时前
Activity 间传值 → Navigation 参数
android·java·kotlin
plainGeekDev19 小时前
onActivityResult → ActivityResult API
android·java·kotlin
Sunia19 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi20 小时前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端
狼爷2 天前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy2 天前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java12342 天前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java