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

相关推荐
憧憬成为java架构高手的小白1 分钟前
langchain4j手敲理解
java·langchain
北i31 分钟前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
10mAh42 分钟前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
thefool1122661 小时前
多线程 4
java
wewowilling1 小时前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小羊没烦恼!1 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
棉猴1 小时前
玩游戏学Python5-函数
开发语言·python·函数·玩游戏·游戏编程
Rain的Java大神之路1 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源2 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
谢亮_vipxieliang2 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript