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,而不是手写回调

相关推荐
步行cgn5 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风5 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae5 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路6 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog6 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog6 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz7 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
qq_2518364578 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
caoerzhong8 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源
曹牧8 小时前
Java集合框架:List、ArrayList、Map 和 HashMap
java