首頁  >  文章  >  Java  >  Java 非同步回呼機制

Java 非同步回呼機制

伊谢尔伦
伊谢尔伦原創
2016-12-05 11:51:451253瀏覽

一、什麼是回呼

回調,回調。要先有調用,才有調用者和被調用者之間的回調。所以在百度百科中是這樣的:

軟體模組之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和非同步調用。 
回呼是一種特殊的調用,至於三種方式也有點不同。

1、同步回調,即阻塞,單向。

2、回調,即雙向(類似自行車的兩個齒輪)。

3、非同步調用,即透過非同步訊息進行通知。

二、CS中的非同步回呼(java案例)

例如這裡模擬個場景:客戶端發送msg給服務端,服務端處理後(5秒),回調給客戶端,告知處理成功。程式碼如下:

回呼介面類別:

public interface CSCallBack {
    public void process(String status);
}

模擬客戶端:

public class Client implements CSCallBack {

    private Server server;    
      public Client(Server server) {        
      this.server = server;
    }    
      public void sendMsg(final String msg){
        System.out.println("客户端:发送的消息为:" + msg);        
             new Thread(new Runnable() {            
             @Override
            public void run() {
                server.getClientMsg(Client.this,msg);
            }
        }).start();
        System.out.println("客户端:异步发送成功");
    }    
             @Override
    public void process(String status) {
        System.out.println("客户端:服务端回调状态为:" + status);
    }
}

模擬服務端:

public class Server {
    public void getClientMsg(CSCallBack csCallBack , String msg) {
        System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg);        
        // 模拟服务端需要对数据处理
        try {
            Thread.sleep(5 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("服务端:数据处理成功,返回成功状态 200");
        String status = "200";
        csCallBack.process(status);
    }
}

測試類別:

public class CallBackTest {
    public static void main(String[] args) {
        Server server = new Server();
        Client client = new Client(server);
        client.sendMsg("Server,Hello~");
    }
}

核心總結如下

客户端:发送的消息为:Server,Hello~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态 200客户端:服务端回调状态为:200

三、回呼的應用場景

回呼目前運用在什麼場景比較多呢?從作業系統到開發者呼叫:

1、接口作为方法参数,其实际传入引用指向的是实现类
2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。

補充:其中 Filter(過濾器)和Interceptor(攔截器)的區別,攔截器基於是Java的反射機制,和容器無關。但與回呼機制有異曲同工之妙。

總之,這設計讓底層程式碼呼叫高層定義(實作層)的子程序,增強了程式的彈性。

四、模式對比

上面講了Filter和Intercepter有著異曲同工之妙。其實介面回呼機制和一種設計模式—觀察者模式也有相似之處:

觀察者模式:

GOF說— 「定義物件的一種一對多的依賴關係,當一個物件的狀態發送改變的時候,所有對他依賴的物件都被通知到並更新。

介面回呼:

與觀察者模式的區別是,它是種原理,而非具體實現。

五、心得

總結四步驟:

機制,即原理。

模式,即是體現。

記住具體場景,常見模式。
然後深入理解原理。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn