# 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应用都使用异步回调的原因 - 就像生活中的外卖订餐一样,不需要等待,可以同时处理多个任务!