日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java回调函数机制

發(fā)布時間:2023/12/9 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java回调函数机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java回調函數機制


參考了網上的一些資料,下面也做出一些總結,供初學者了解學習。


一、?概述

軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調、異步調用?

同步調用:一種阻塞式調用,調用方要等待對方執(zhí)行完畢才返回,它是一種單向調用;?

回調:一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;?

異步調用:一種類似消息或事件的機制,解決了同步阻塞的問題,它的調用方向剛好相反,接口的服務在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調用客戶方的接口)。




回調和異步調用的關系非常緊密:使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。


理解異步和同步

1.通俗說,異步就是不需要等當前執(zhí)行的動作完成,就可以繼續(xù)執(zhí)行后面的動作。

2.通常一個程序執(zhí)行的順序是:從上到下,依次執(zhí)行。后面的動作必須等前面動作執(zhí)行完成以后方可執(zhí)行。這就是和異步相對的一個概念——同步。


案例:

A、張三打電話給李四,讓李四幫忙寫份材料。

B、李四接到電話的時候,手上有自己的工作要處理,但他答應張三,忙完手上的工作后馬上幫張三寫好材料,并傳真給張三。

C、通完電話后,張三外出辦事。


說明:

張三給李四通完電話后,就出去辦事了,他并不需要等李四把材料寫好才外出。那么張三讓李四寫材料的消息就屬于異步消息。

相反,如果張三必須等李四把材料寫好才能外出辦事的話,那么這個消息就屬于同步消息了。


二、?異步的實現

傳統(tǒng)的程序執(zhí)行代碼都是從上到下,一條一條執(zhí)行。但生活中有很多情況并不是這樣,以上的案例中,如果李四需要幾個小時以后才能幫張三寫好材料的話,那張三就必須等幾個小時,這樣張三可能會崩潰或者抓狂。這種一條龍似的處理,顯示不太合理。


可以使用以下辦法來處理這種問題:

張三找王五去給李四打電話,等李四寫好材料后,由王五轉交給張三。這樣張三就可以外出辦其他的事情了。

?

問題得到了合理的解決,之前張三一條線的工作,由張三和王五兩條線來完成了,兩邊同時進行,彼此不耽誤。

?

三、?計算機語言的實現

辦法有了,如何用程序來模擬實現呢?

?

A、以前由一個線程來處理的工作,可以通過新增一個線程來達到異步的目的。

B、最后李四寫好的材料必須交給張三,以做他用。這就是回調。

?

回調你可以這樣來理解:

A發(fā)送消息給B,

B處理好A要求的事情后,將結果返回給A,

A再對B返回的結果來做進一步的處理。

?

四、 模擬異步消息的發(fā)送與回調

A、 回調的實現

/** * 回調接口 */ public interface CallBack { /** * 執(zhí)行回調方法 * @param objects 將處理后的結果作為參數返回給回調方法 */ public void execute(Object... objects ); }
Java是面向對象的語言,因此回調函數就變成了回調接口。


B、 消息的發(fā)送者

/** * 簡單本地發(fā)送異步消息的類 */ public class Local implements CallBack,Runnable{ /** * 遠程接收消息的類,模擬point-to-point */ private Remote remote; /** * 發(fā)送出去的消息 */ private String message; public Local(Remote remote, String message) { super(); this.remote = remote; this.message = message; } /** * 發(fā)送消息 */ public void sendMessage() { /**當前線程的名稱**/ System.out.println(Thread.currentThread().getName()); /**創(chuàng)建一個新的線程發(fā)送消息**/ Thread thread = new Thread(this); thread.start(); /**當前線程繼續(xù)執(zhí)行**/ System.out.println("Message has been sent by Local~!"); } /** * 發(fā)送消息后的回調函數 */ public void execute(Object... objects ) { /**打印返回的消息**/ System.out.println(objects[0]); /**打印發(fā)送消息的線程名稱**/ System.out.println(Thread.currentThread().getName()); /**中斷發(fā)送消息的線程**/ Thread.interrupted(); } public static void main(String[] args) { Local local = new Local(new Remote(),"Hello"); local.sendMessage(); } public void run() { remote.executeMessage(message, this); } }
C、 遠程消息的接收者

/** * 處理消息的遠程類 * */ public class Remote { /** * 處理消息 * @param msg 接收的消息 * @param callBack 回調函數處理類 */ public void executeMessage(String msg,CallBack callBack) { /**模擬遠程類正在處理其他事情,可能需要花費許多時間**/ for(int i=0;i<1000000000;i++) { } /**處理完其他事情,現在來處理消息**/ System.out.println(msg); System.out.println("I hava executed the message by Local"); /**執(zhí)行回調**/ callBack.execute(new String[]{"Nice to meet you~!"}); } }
執(zhí)行 Local 類的 main 方法。
?
注意Local類中:

remote.executeMessage(message, this);

executeMessage 方法需要接收一個message參數,表示發(fā)送出去的消息,而CallBack參數是他自己,也就是這里的this。表示發(fā)送消息后,由Local類自己來處理,調用自身的execute方法來處理消息結果。

如果這里不是用this,而是用其他的CallBack接口的實現類的話,那就不能稱之為“回調”了,在OO的世界里,那就屬于“委派”。也就是說,“回調” 必須是消息的發(fā)送者來處理消息結果,否則不能稱之為回調。這個概念必須明確。



五、更多異步 + 回調 編程模式的例子


1.某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那里傻等,于是我們約定:等你想
出辦法后打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。其中,你后來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是注冊回調函數;我的手機號碼應該有效并且手機能夠接收到你的呼叫,這是回調函數必須符合接口規(guī)范


2.有一位老板很忙,他沒有時間盯著員工干活,然后他告訴自己的雇員,干完當前這些事情后,告訴他干活的結果。

創(chuàng)建一個回調接口,讓老板得告知干完活如何找到他的方式:留下老板辦公室地址:

package net.easyway.test; /** * 此接口為聯系的方式,不論是電話號碼還是聯系地址,作為 * 老板都必須要實現此接口* */ public interface CallBackInterface { public void execute(); }
創(chuàng)建回調對象,就是老板本人,因為員工干完活后要給他打電話,因此老板必須實現回調接口,不然員工去哪里找老板?



package net.easyway.test; /** * 老板是作為上層應用身份出現的,下層應用(員工)是不知道 * 有哪些方法,因此他想被下層應用(員工)調用必須實現此接口 * */ public class Boss implements CallBackInterface { @Override public void execute() { System.out.println("收到了!!" + System.currentTimeMillis()); } }
創(chuàng)建控制類,也就是員工對象,他必須持有老板的地址(回調接口),即使老板換了一茬又一茬,辦公室不變,總能找到對應的老板。



package net.easyway.test; /** * 員工類,必須要記住,這是一個底層類,底層是不了解上層服務的 * */ public class Employee { private CallBackInterface callBack = null; //告訴老板的聯系方式,也就是注冊 public void setCallBack(CallBackInterface callBack){ this.callBack = callBack; } //工人干活 public void doSome(){ //1.開始干活了 for(int i=0;i<10;i++){ System.out.println("第【" + i + "】事情干完了!"); } //2.告訴老板干完了 callBack.execute(); } }

測試類:

package net.easyway.test; public class Client { public static void main(String[] args) { Employee emp = new Employee(); //將回調對象(上層對象)傳入,注冊 emp.setCallBack(new Boss()); //開啟控制器對象運行 emp.doSome(); } }


總結

以上是生活随笔為你收集整理的java回调函数机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。