# Summary
## 1. **非阻塞**
```Java
同步:我等你做完,再做下一件事
异步:你先做着,我忙别的,做好了告诉我
```
## 2. **回调函数**
```Java
回调函数 = 当事情做完后要执行的函数
就像:当外卖做好后要执行的"取餐"动作
```
## 3. **事件驱动**
```Java
事件发生 → 触发回调 → 执行相应动作
就像:门铃响了 → 触发"开门"动作
```
# Cues
[lambda表达式](lambda表达式.md)
# Notes
```java
@RestController
public class ChatController {
@PostMapping(value = "/chat/stream", produces = "text/event-stream")
public ResponseEntity<StreamingResponseBody> chatStream(@RequestBody ChatRequest request) {
StreamingResponseBody responseBody = outputStream -> {
// 使用回调模式
processMessageWithCallback(request.getMessage(), new EventCallback() {
@Override
public void onEvent(String event) {
try {
outputStream.write(event.getBytes());
outputStream.flush();
} catch (IOException e) {
// 错误处理
}
}
@Override
public void onError(Exception error) {
try {
String errorEvent = "data: {\"type\": \"error\", \"error\": \"" + error.getMessage() + "\"}\n\n";
outputStream.write(errorEvent.getBytes());
outputStream.flush();
} catch (IOException e) {
// 错误处理
}
}
@Override
public void onComplete() {
// 处理完成
}
});
};
return ResponseEntity.ok()
.header("Content-Type", "text/event-stream")
.body(responseBody);
}
private void processMessageWithCallback(String message, EventCallback callback) {
CompletableFuture.runAsync(() -> {
try {
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
String event = String.format("data: {\"type\": \"message\", \"content\": \"Event %d\"}\n\n", i);
callback.onEvent(event);
}
callback.onComplete();
} catch (Exception e) {
callback.onError(e);
}
});
}
interface EventCallback {
void onEvent(String event);
void onError(Exception error);
void onComplete();
}
}
```
好的!我用生活中的例子来解释异步回调,这样更容易理解。
## 生活中的异步回调例子
### 1. **外卖订餐 - 最经典的例子**
#### **同步方式(阻塞)**
```Java
你:老板,我要一份宫保鸡丁
老板:好的,你在这等着,我现做
你:😴 坐在店里等30分钟...
老板:做好了!给你
你:终于可以吃了!
```
#### **异步回调方式(非阻塞)**
```Java
你:老板,我要一份宫保鸡丁,做好了打电话给我
老板:好的,你先去忙别的
你:😊 去逛街、看电影、喝咖啡...
老板:�� 喂,你的宫保鸡丁做好了!
你:好的,我马上来取!
```
**对应代码:**
```python
# 同步方式
def order_food_sync():
print("开始做菜...")
time.sleep(30) # 阻塞30分钟
print("菜做好了!")
return "宫保鸡丁"
# 异步回调方式
def order_food_async(callback):
def cook_food():
time.sleep(30) # 异步做菜
callback("宫保鸡丁做好了!") # 回调通知
threading.Thread(target=cook_food).start() # 异步执行
print("你可以去忙别的了...")
# 使用回调
def on_food_ready(food):
print(f"收到通知:{food}")
order_food_async(on_food_ready)
```
### 2. **快递配送 - 实时通知**
#### **传统方式(轮询)**
```Java
你:快递到了吗?
快递员:还没
你:快递到了吗?
快递员:还没
你:快递到了吗?
快递员:还没
你:快递到了吗?
快递员:到了!
```
#### **异步回调方式(推送通知)**
```Java
你:快递到了请打电话给我
快递员:好的
你:�� 睡觉、工作、娱乐...
快递员:�� 你的快递到了,请下楼取!
你:好的,马上来!
```
**对应代码:**
```python
# 传统轮询方式
def check_delivery_polling():
while True:
if is_delivery_ready():
print("快递到了!")
break
time.sleep(5) # 每5秒检查一次
# 异步回调方式
def request_delivery_callback(callback):
def delivery_process():
time.sleep(60) # 模拟配送时间
callback("快递到了,请下楼取!")
threading.Thread(target=delivery_process).start()
def on_delivery_ready(message):
print(f"收到通知:{message}")
request_delivery_callback(on_delivery_ready)
```
### 3. **银行转账 - 异步处理**
#### **同步方式**
```Java
你:我要转账1000元
银行:正在处理,请稍等...
你:�� 等待5分钟...
银行:转账成功!
你:终于好了!
```
#### **异步回调方式**
```Java
你:我要转账1000元,处理完发短信给我
银行:好的,请先离开
你:😊 去办其他事情...
银行:📱 您的转账已成功,余额xxx元
你:收到通知了!
```
**对应代码:**
```python
# 同步方式
def transfer_money_sync(amount):
print("正在处理转账...")
time.sleep(5) # 阻塞5分钟
print("转账成功!")
return "success"
# 异步回调方式
def transfer_money_async(amount, callback):
def process_transfer():
time.sleep(5) # 异步处理
callback("转账成功,余额10000元")
threading.Thread(target=process_transfer).start()
print("您可以先离开,处理完会通知您")
def on_transfer_complete(message):
print(f"收到短信:{message}")
transfer_money_async(1000, on_transfer_complete)
```
## 在Web开发中的应用
### **聊天应用 - 实时消息推送**
#### **传统方式(轮询)**
```javascript
// 客户端每5秒询问一次
setInterval(() => {
fetch('/api/messages')
.then(response => response.json())
.then(messages => {
// 显示新消息
});
}, 5000);
```
#### **异步回调方式(SSE)**
```javascript
// 客户端建立长连接,等待服务器推送
const eventSource = new EventSource('/api/chat/stream');
eventSource.onmessage = function(event) {
// 收到新消息时自动触发
displayMessage(event.data);
};
```
**对应Python代码:**
```python
# 服务器端异步回调
async def chat_stream(request):
async def event_generator():
# 当有新消息时,通过yield推送
async for message in get_new_messages():
yield f"data: {message}\n\n" # 回调推送
return EventSourceResponse(event_generator())
```
## 生活中的其他例子
### **4. 洗衣机洗衣服**
```Java
同步:站在洗衣机前等1小时
异步:设置好程序,洗好了会"滴滴"响,你去忙别的
```
### **5. 餐厅等位**
```Java
同步:坐在门口等叫号
异步:取号后去逛街,到你了会打电话
```
### **6. 医院看病**
```Java
同步:坐在诊室等医生
异步:先去做检查,结果出来了会通知你
```
## 总结
**异步回调的本质**:
1. **不等待**:不阻塞当前流程
2. **先做别的**:可以处理其他任务
3. **完成后通知**:通过回调函数告知结果
4. **提高效率**:充分利用时间
**在编程中**:
- **同步**:`result = do_something()` - 等待结果
- **异步**:`do_something_async(callback)` - 不等待,完成后回调
这就是为什么现代Web应用都使用异步回调的原因 - 就像生活中的外卖订餐一样,不需要等待,可以同时处理多个任务!