java深入理解---非同步回撥機制例項解析
一、什麼是回撥
回撥,回撥。要先有呼叫,才有呼叫者和被呼叫者之間的回撥。所以在百度百科中是這樣的:
軟體模組之間總是存在著一定的介面,從呼叫方式上,可以把他們分為三類:同步呼叫、回撥和非同步呼叫。
回撥是一種特殊的呼叫,至於三種方式也有點不同。
1、同步回撥,即阻塞,單向。
2、回撥,即雙向(類似自行車的兩個齒輪)。
3、非同步呼叫,即通過非同步訊息進行通知。
二、CS中的非同步回撥(java案例)
比如這裡模擬個場景:客戶端傳送msg給服務端,服務端處理後(5秒),回撥給客戶端,告知處理成功。程式碼如下:
回撥介面類:
- /**
- * @author Jeff Lee
- * @since 2015-10-21 21:34:21
- * 回撥模式-回撥介面類
- */
- publicinterface CSCallBack {
- publicvoid process(String status);
- }
模擬客戶端:
- /**
- * @author Jeff Lee
- * @since 2015-10-21 21:25:14
- * 回撥模式-模擬客戶端類
- */
- publicclass Client implements CSCallBack {
- private Server server;
- public Client(Server server) {
- this.server = server;
- }
- public
- System.out.println("客戶端:傳送的訊息為:" + msg);
- new Thread(new Runnable() {
- @Override
- publicvoid run() {
- server.getClientMsg(Client.this,msg);
- }
- }).start();
- System.out.println("客戶端:非同步傳送成功");
- }
- @Override
- publicvoid process(String status) {
- System.out.println("客戶端:服務端回撥狀態為:" + status);
- }
- }
模擬服務端:
- /**
- * @author Jeff Lee
- * @since 2015-10-21 21:24:15
- * 回撥模式-模擬服務端類
- */
- publicclass Server {
- publicvoid 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);
- }
- }
測試類:
- /**
- * @author Jeff Lee
- * @since 2015-10-21 21:24:15
- * 回撥模式-測試類
- */
- publicclass CallBackTest {
- publicstaticvoid 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本身(對應第一點)。
還有值得一提的是
— 開原始碼都在我的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操作 程式碼卡