1. 程式人生 > >java深入理解---非同步回撥機制例項解析

java深入理解---非同步回撥機制例項解析

一、什麼是回撥

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

軟體模組之間總是存在著一定的介面,從呼叫方式上,可以把他們分為三類:同步呼叫、回撥和非同步呼叫。

回撥是一種特殊的呼叫,至於三種方式也有點不同。

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

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

3、非同步呼叫,即通過非同步訊息進行通知。

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

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

回撥介面類:

  1. /** 
  2. * @author Jeff Lee 
  3. * @since 2015-10-21 21:34:21
     
  4. * 回撥模式-回撥介面類 
  5. */
  6. publicinterface CSCallBack { 
  7.     publicvoid process(String status); 

模擬客戶端:

  1. /** 
  2. * @author Jeff Lee 
  3. * @since 2015-10-21 21:25:14 
  4. * 回撥模式-模擬客戶端類 
  5. */
  6. publicclass Client implements CSCallBack { 
  7.     private Server server; 
  8.     public Client(Server server) { 
  9.         this.server = server; 
  10.     } 
  11.     public
    void sendMsg(final String msg){ 
  12.         System.out.println("客戶端:傳送的訊息為:" + msg); 
  13.         new Thread(new Runnable() { 
  14.             @Override
  15.             publicvoid run() { 
  16.                 server.getClientMsg(Client.this,msg); 
  17.             } 
  18.         }).start(); 
  19.         System.out.println("客戶端:非同步傳送成功"); 
  20.     } 
  21.     @Override
  22.     publicvoid process(String status) { 
  23.         System.out.println("客戶端:服務端回撥狀態為:" + status); 
  24.     } 

模擬服務端:

  1. /** 
  2. * @author Jeff Lee 
  3. * @since 2015-10-21 21:24:15 
  4. * 回撥模式-模擬服務端類 
  5. */
  6. publicclass Server { 
  7.     publicvoid getClientMsg(CSCallBack csCallBack , String msg) { 
  8.         System.out.println("服務端:服務端接收到客戶端傳送的訊息為:" + msg); 
  9.         // 模擬服務端需要對資料處理
  10.         try { 
  11.             Thread.sleep(5 * 1000); 
  12.         } catch (InterruptedException e) { 
  13.             e.printStackTrace(); 
  14.         } 
  15.         System.out.println("服務端:資料處理成功,返回成功狀態 200"); 
  16.         String status = "200"
  17.         csCallBack.process(status); 
  18.     } 

測試類:

  1. /** 
  2. * @author Jeff Lee 
  3. * @since 2015-10-21 21:24:15 
  4. * 回撥模式-測試類 
  5. */
  6. publicclass CallBackTest { 
  7.     publicstaticvoid main(String[] args) { 
  8.         Server server = new Server(); 
  9.         Client client = new Client(server); 
  10.         client.sendMsg("Server,Hello~"); 
  11.     } 

執行下測試類 — 列印結果如下:

客戶端:傳送的訊息為:Server,Hello~
客戶端:非同步傳送成功
服務端:服務端接收到客戶端傳送的訊息為:Server,Hello~

(這裡模擬服務端對資料處理時間,等待5秒)
服務端:資料處理成功,返回成功狀態 200
客戶端:服務端回撥狀態為:200

一步一步分析下程式碼,核心總結如下

1、介面作為方法引數,其實際傳入引用指向的是實現類

2、Client的sendMsg方法中,引數為final,因為要被內部類一個新的執行緒可以使用。這裡就體現了非同步。

3、呼叫server的getClientMsg(),引數傳入了Client本身(對應第一點)。

還有值得一提的是

— 開原始碼都在我的gitHub上哦~

三、回撥的應用場景

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

1、Windows平臺的訊息機制

2、非同步呼叫微信介面,根據微信返回狀態對出業務邏輯響應。

3、Servlet中的Filter(過濾器)是基於回撥函式,需容器支援。

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

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

四、模式對比

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

觀察者模式:

GOF說道 — “定義物件的一種一對多的依賴關係,當一個物件的狀態傳送改變的時候,所有對他依賴的物件都被通知到並更新。”它是一種模式,是通過介面回撥的方法實現的,即它是一種回撥的體現。

介面回撥:

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

五、心得

總結四步走:

機制,即是原理。

模式,即是體現。

記住具體場景,常見模式。

然後深入理解原理。

相關推薦

java深入理解---非同步機制例項解析

一、什麼是回撥 回撥,回撥。要先有呼叫,才有呼叫者和被呼叫者之間的回撥。所以在百度百科中是這樣的: 軟體模組之間總是存在著一定的介面,從呼叫方式上,可以把他們分為三類:同步呼叫、回撥和非同步呼叫。 回撥是一種特殊的呼叫,至於三種方式也有點不同。 1、同步回撥,

我的Python成長之路--Day39非同步+機制、執行緒佇列、執行緒Event、協程、Gevent等

1、非同步、同步、阻塞、非阻塞 我們在之前已經簡單介紹過了同步非同步還有阻塞和非阻塞,和本小節我們要介紹的同步呼叫和非同步呼叫有很大關係,所以我們在這裡再囉嗦一下: 1、阻塞與非阻塞指的是程式的兩種執行狀態 阻塞:遇到IO就發生阻塞,程式一旦遇到阻塞操作就會停在原地,並且

關於JAVA中的listener機制,以及其在Android中的使用

第一篇部落格,獻給我的舍友逼哥 @bigname22  部落格:http://my.csdn.net/bigname22 在學習Android的過程中接觸到了java的回撥機制,比如按鈕的監聽回撥,又比如開啟一個子執行緒,在子執行緒完成任務的時候通知主執行緒. 其實JA

android 非同步機制

android事件處理: 基於監聽,基於回撥。 基於監聽,是為android介面元件繫結特定的事件監聽器。主要處理一些特定的事件。 基於回撥,時重寫android元件特定的回撥方法,或者重寫activity的回撥方法。android為絕大部分介面元件都提供了事件響應的回撥方

基礎篇——Handler非同步機制

寫程式碼的四點:      1.明確需求。要做什麼?      2.分析思路。要怎麼做?(1,2,3……)      3.確定步驟。每一個思路要用到哪些語句、方法和物件。      4.程式碼實現。用具體的語言程式碼將思路實現出來。 學習新技術的四點:      

Java基礎篇:機制詳解

一、什麼是回撥: 回撥是一種雙向的呼叫模式,程式模組之間通過這樣的介面呼叫完成通訊聯絡,回撥的核心就是回撥方將本身即this傳遞給呼叫方,這樣呼叫方就可以在呼叫完畢之後再告訴回撥方它想要知道的資訊。 回撥函式用於層間協作,上層將本層函式安裝在下層,這個函式就是回撥,而下層

java機制用的理解例項

生活場景如下: Wang寫數學題,有一道比較難,需要問Li,Li也不會,要先回家一趟問問老爸怎麼做,這個時候有wang如下三種選擇: 1)一直等待Li回來,期間啥也不幹同步方式 2) 等等再過來看Li回來沒,非同步future方式 3)wang把電話留下來,讓LI回來時打電話給自

Java基礎9——深入理解java機制

Java回撥機制 回撥的引入故事 轉載自Bro_超 // 同步回撥 1 public interface doJob 2 { 3 public void fillBlank(int a, int b, int result); 4 } 1 public class Su

深入理解Java中的機制(最通俗易懂的機制的部落格)

1. 什麼是回撥? 在我看來,回撥其實是一個相當具有迷惑性的名字,因為它很容易讓人糾結於回撥這個詞語本身的含義,從而忽略了回撥這種機制的本質。要理解Java中的回撥概念,最好的方式不是通過例項,而是從回撥概念的起源說起。   最開始接觸回撥時在C語言中函式指

夯實Java基礎系列11:深入理解Java中的機制

目錄 模組間的呼叫 多執行緒中的“回撥” Java回撥機制實戰 例項一 : 同步呼叫 例項二:由淺入深 例項三:Tom做題 參考文章

一個經典例子讓你徹徹底底理解java機制

                以前不理解什麼叫回調,天天聽人家說加一個回撥方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回撥:就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法,這樣子說你是不是有點暈暈的,

深入淺出: Java機制(非同步)

Writer      :李強強 什麼是回撥?今天傻傻地截了張圖問了下,然後被陳大牛回答道“就一個回撥…”。此時千萬個草泥馬飛奔而過(逃 哈哈,看著原始碼,享受著這種回撥在程式碼上的作用,真是美哉。不妨總結總結。 一、什麼是回撥 回撥,回撥。要先有呼叫,才有呼叫者和被呼叫者之間的回撥。所以在百

Java機制(非同步)

什麼是回撥?今天傻傻地截了張圖問了下,然後被陳大牛回答道“就一個回撥…”。此時千萬個草泥馬飛奔而過(逃 哈哈,看著原始碼,享受著這種回撥在程式碼上的作用,真是美哉。不妨總結總結。 一

一個經典的例子讓你徹底理解Java機制

以前不理解什麼叫回調,天天聽人家說加一個回撥方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回撥:就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法,這樣子說你是不是有點暈暈的,其實我剛開始也是這樣不理解,

Java 機制解析(同步/非同步)

回撥:簡單來說,就是我呼叫你的函式,你呼叫我的函式。正規一點的說法就是類A的a()函式呼叫類B的b()函式,當類B的b()函式的執行時又去呼叫類A裡的函式。是一種雙向的呼叫方式。一般情況下,回撥分兩種,分別是同步回撥和非同步回撥。 同步回撥:一種雙向呼叫模式

理解JavaScript 執行機制非同步(setTimeout/setInterval/Promise)

對於javascript執行機制的理解一直都是混淆不清。在面試或工作的過程中,也經常會遇到程式碼執行順序或函式生命週期載入等類似的問題,這些多多少少都與javascript的執行機制相關。今天發現一篇很好的文章,欣喜之餘,加以轉載,供感興趣的小夥伴學習,感謝作者分享。 不論

java機制

簡單的解釋       你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。在這個例子裡,你的電話號碼就叫回調函式,你把電話留給店員就叫登

Java執行緒之非同步(Callback)

●介紹      有時候執行一個任務需要很長時間,單執行緒下執行緒會處於阻塞狀態。這個時候我們會考慮一種非阻塞的處理模式。非阻塞任務在任何程式語言裡都必不可少,Java也不例外。多執行緒就是一個很好的解決辦法。     

非同步、+機制、執行緒queue、執行緒Event、協程、單執行緒實現遇到IO切換

# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor # import requests # import os # import time # import random # # def get(

同步呼叫 非同步呼叫+機制

1 同步呼叫 非同步呼叫+回撥機制 提交任務的兩種方式: 同步呼叫 :提交任務必須等待任務完成,才能執行下一行 非同步呼叫 :提交任務不需要等待任務完成,立即執行下一行 任務執行的三種狀態: 阻塞 阻塞 遇到了IO操作 程式碼卡