首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 異步回調機制實戰:接口回調模式與觀察者模式對比

     編輯:Java 相關知識

回調本質

「好萊塢原則」:**Don't call us, we'll call you**。底層庫在事件發生時調用上層提供的接口方法。

三種調用風格

類型特點例子
同步調用阻塞等待結果普通方法調用
回調雙向:調用者傳入接口,被調用者稍後回調事件監聽器
異步調用發起後立即返回,通過消息/線程通知完成Future/CompletableFuture

代碼實現:客戶端-服務端異步回調

1. 回調接口


public interface Callback {
    void onResult(String status);
}

2. 客戶端 (實現接口 + 異步發送)


public class Client implements Callback {
    private Server server;
    public Client(Server server) { this.server = server; }

    public void sendMsg(final String msg) {
        System.out.println("客戶端發送: " + msg);
        new Thread(() -> server.receive(this, msg)).start(); // 異步
        System.out.println("客戶端異步發送成功,繼續其他工作");
    }

    @Override public void onResult(String status) {
        System.out.println("客戶端收到回調: " + status);
    }
}

3. 服務端 (處理耗時任務 + 回調)


public class Server {
    public void receive(Callback cb, String msg) {
        System.out.println("服務端收到: " + msg);
        try { Thread.sleep(5000); } catch (InterruptedException ignored) {} // 模擬處理
        System.out.println("服務端處理完成");
        cb.onResult("200 OK"); // 回調
    }
}

4. 測試


public class Test {
    public static void main(String[] args) {
        Server s = new Server();
        Client c = new Client(s);
        c.sendMsg("Hello Server");
        System.out.println("主線程未阻塞,繼續執行...");
    }
}

核心要點

  1. 接口作為方法參數,實際傳入實現類引用 (多態)
  2. 異步執行靠新線程 new Thread(...).start()
  3. 客戶端 this 作為回調對象傳給服務端

應用場景

  • Windows 消息循環 (WndProc)
  • 微信/支付異步通知回調
  • Servlet Filter (容器回調)

模式對比:回調 vs 觀察者

維度接口回調觀察者模式
本質機制/原理設計模式 (具體實現)
關係一對一 (通常)一對多 (主題-觀察者)
解耦程度較低 (直接持有接口引用)較高 (主題不知觀察者具體類)
實現基礎即回調機制基於回調實現

觀察者模式 = 回調機制 + 註冊/通知框架 + 多對一廣播。

Filter vs Interceptor

  • Filter:Servlet 規範,基於回調,依賴容器,請求進入 Servlet 前/後攔截
  • Interceptor:Spring MVC,基於**反射/AOP**,不依賴容器,Controller 方法前/後攔截
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved