🚀 Java 异步回调的两种实现方式详解
在日常开发中,我们经常会遇到这样的场景:
👉 任务提交后不阻塞主线程,任务完成后自动通知调用方
这就是典型的 异步回调模型。
本文通过一个「老板-员工」的案例,对比两种实现方式:
- 基于
Callback接口(传统方式) - 基于
CompletableFuture(推荐方式)
🧩 一、什么是异步回调?
异步回调的核心思想是:
调用方发起任务后不等待结果,而是在任务完成时由执行方主动通知调用方
📌 举个例子:
- 老板安排任务
- 员工执行任务(异步)
- 员工完成后通知老板
🛠 二、基于 Callback 接口实现
1️⃣ 实现思路
流程如下:
- 老板调用员工执行任务
- 员工开启新线程处理任务
- 任务完成后调用回调接口通知老板
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,而不是手写回调