日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java中的回調(diào)

瀏覽:176日期:2022-08-26 14:44:38

又忙了一周,事情差不多解決了,終于有可以繼續(xù)寫我的博客了(各位看官久等了)。

這次我們來談一談Java里的一個很有意思的東西——回調(diào)。

什么叫回調(diào),一本正經(jīng)的來講,在計算機程序設計中,回調(diào)函數(shù)是指通過函數(shù)參數(shù)傳遞到其它代碼的,某一塊可執(zhí)行代碼的引用。這一設計允許了底層代碼調(diào)用在高層定義的子程序。

別急別急,且聽我慢慢道來。

舉個栗子,設置這樣一個情景,老板安排員工做事,然后讓他做完后跟他電話說一聲。老板當然不會在那里一直等員工做完事情才去做其他事,而是只交代完任務就去忙自己的事情了。

這個例子包含了異步+回調(diào)的思想,員工做完任務后向老板報告這個過程,就叫回調(diào),當然,報告的話,老板肯定先跟員工說好了報告方式,比如說郵件,電話等,而交代報告方式,就是注冊回調(diào)函數(shù),這里的回調(diào)函數(shù)必須符合接口的規(guī)范。

好像還是有些不明白?來上代碼吧。

先定義一個接口:.

public interface ReceiveReport { /** * 接收報告 * @param name 員工名稱 * @param report 報告內(nèi)容 */ public void receiveReport(String name,String report);}

定義一個Boss類實現(xiàn)這個接收報告的接口:

public class Boss implements ReceiveReport{ private Worker worker; public Boss(Worker worker){ this.worker = worker; } /** * 下達任務 */ public void sendTask(){ worker.work(this); } /** * 接收報告 * @param name 員工名稱 * @param report 報告內(nèi)容 */ public void receiveReport(String name,String report){ System.out.println('收到:'+name+' 的報告:'+report); }}

定義一個Worker接口:

public interface Worker { public void work(ReceiveReport boss);}

定義一個員工類。

public class Employee implements Worker{ private String name;//員工姓名 //構造器 public Employee(String name) { this.name = name; } /** * 工作 * @param boss 任務名稱 */ public void work(ReceiveReport boss){ System.out.println(name + ' is doing works.'); String report = '我已經(jīng)完成了任務!'; boss.receiveReport(name,report); }}

然后來測試一下:

public class Test { public static void main(String[] args) { Worker employee = new Employee('Frank');//定義一個員工 Boss boss = new Boss(employee);//定義一個Boss //boss開始下達任務 boss.sendTask(); }}

測試結果:

Frank is doing works.收到:Frank 的報告:我已經(jīng)完成了任務!

至此,員工與老板的交互就完成了,這就是一個簡單的同步回調(diào)了。Boss通過Worker接口可以給員工安排工作,而不用去關心是哪個員工在工作,Worker通過ReceiveReport來向Boss報告工作情況,兩個類通過接口進行回調(diào)交互,可以很好的解耦合,因為Boss可以安排不同的員工,只要他們實現(xiàn)了Worker接口就行,而員工也可以向不同的boss匯報情況,只要實現(xiàn)了ReceiveReport接口即可。

其實回調(diào)的核心思想就是把自身的this指針傳給調(diào)用方,就像這里把employee傳入Boss類中,在work方法中又注冊了回調(diào),于是兩者的交互性就很強了。

那么為什么要用回調(diào)呢?如果Boss要在員工完成工作之前登記員工的一些信息,如姓名等,那么有了回調(diào)機制,通過把this指針傳入,就能在Boss內(nèi)部為所欲為了,而不需要通過設計新的方法來獲取,而且需要獲得的數(shù)據(jù)越多,回調(diào)的優(yōu)勢越明顯。

其實這里只是簡單的一對一關系,如果是一個Boss,多個員工,那就是簡單的觀察者模式,如果是多個Boss多個員工,那就是簡單生產(chǎn)者-消費者模式了。

當然,這里僅僅是簡單的同步回調(diào)。員工只能一個接一個的去完成任務,也就是說前一個員工必須等待后一個員工完成任務后才能開始任務,事實上,員工一般是同時進行工作的。

如果換一個場景,現(xiàn)在有十個員工,老板發(fā)布任務,前三名完成的人有獎金獎勵,那么就需要用到異步回調(diào)了,sendTask的時候使用線程即可,我們來修改一下代碼:

/** * @author Frank * @create 2017/12/3 * @description 接收報告接口 */public interface ReceiveReport { /** * 接收報告 * @param worker 員工 * @param report 報告內(nèi)容 */ public void receiveReport(Worker worker,String report);}

/** * @author Frank * @create 2017/12/3 * @description 工人接口 */public interface Worker { public void work(String taskName); public void setReceiveReport(ReceiveReport boss); public void getReward(Double money); public String getName();}

import java.util.Random;/** * @author Frank * @create 2017/12/3 * @description 員工類 */public class Employee implements Worker{ private ReceiveReport boss; private String name;//員工姓名 @Override public String getName() { return name; } //構造器 public Employee(String name) { this.name = name; } public void setReceiveReport(ReceiveReport boss) { this.boss = boss; } @Override public void getReward(Double money) { System.out.println(name+'由于表現(xiàn)突出,獲得$'+money+'現(xiàn)金獎勵!'); } /** * 工作 * @param taskName 任務名稱 */ public void work(String taskName){ System.out.println(name + ' is doing works:'+taskName); Random random = new Random(); Integer time = random.nextInt(10000); try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } String report = '順利完成任務!'; //通知老板 boss.receiveReport(this,report); }}

import java.util.ArrayList;import java.util.List;/** * @author Frank * @create 2017/12/3 * @description Boss類 */public class Boss implements ReceiveReport{ private List<Worker> workers = new ArrayList<>();//老板管理的員工 private volatile int index;//順序 /** * 添加員工 * @param worker 員工 */ public void addWorker(Worker worker){ workers.add(worker); worker.setReceiveReport(this); } /** * 下達任務 */ public void sendTask(String task){ //給各個員工依次下達任務 for (Worker w:workers){ new Thread(new Runnable() {@Overridepublic void run() { w.work(task);} }).start(); } } /** * 接收報告 * @param worker 員工 * @param report 報告內(nèi)容 */ public void receiveReport(Worker worker,String report){ int index = ++this.index; System.out.println(worker.getName()+'獲得第'+index+'名'); if (index <= 3){ //給前三名發(fā)獎金 worker.getReward(1000.0*(4-index)); } }}

/** * @author Frank * @create 2017/12/3 * @description */public class Test { public static void main(String[] args) { Boss boss = new Boss();//定義一個Boss //定義十個員工 for (int i=0;i<10;i++){ Worker worker = new Employee('Employee['+i+']'); boss.addWorker(worker); } //boss開始下達任務 boss.sendTask('Say Hello'); }}

這里沒有使用鎖,因為設置的時間間隔區(qū)間為0-10s,發(fā)生并發(fā)沖突的概率很低,而且由于現(xiàn)在還沒有說多線程的內(nèi)容,所以暫時先不使用。只需要知道在sendTask方法中,依次啟動了線程來調(diào)用每個Worker的work方法,線程啟動后會同時執(zhí)行,執(zhí)行完畢后,又會調(diào)用Boss的receiveReport方法來向Boss反饋結果,接收結果后,根據(jù)完成順序,再調(diào)用Worker的getReward方法來給前三名發(fā)獎金。其實這里是雙向回調(diào)了,Boss把this指針傳給了Worker,Worker又把自己的this指針傳給了Worker。

程序執(zhí)行結果如下:

Employee[0] is doing works:Say HelloEmployee[4] is doing works:Say HelloEmployee[3] is doing works:Say HelloEmployee[2] is doing works:Say HelloEmployee[1] is doing works:Say HelloEmployee[5] is doing works:Say HelloEmployee[7] is doing works:Say HelloEmployee[6] is doing works:Say HelloEmployee[9] is doing works:Say HelloEmployee[8] is doing works:Say HelloEmployee[9]獲得第1名Employee[9]由于表現(xiàn)突出,獲得$3000.0現(xiàn)金獎勵!Employee[7]獲得第2名Employee[7]由于表現(xiàn)突出,獲得$2000.0現(xiàn)金獎勵!Employee[3]獲得第3名Employee[3]由于表現(xiàn)突出,獲得$1000.0現(xiàn)金獎勵!Employee[1]獲得第4名Employee[0]獲得第5名Employee[5]獲得第6名Employee[4]獲得第7名Employee[8]獲得第8名Employee[6]獲得第9名Employee[2]獲得第10名

因為使用了多線程,所以每次運行的結果可能都會不一樣,如果得到了不一樣的結果,那是很正常的現(xiàn)象。

舉了這兩個栗子,對回調(diào)應該也有了一定的了解了吧。

其實回調(diào)只是一種思想,并不是java中獨有的內(nèi)容,思想這種東西,是為了解決特定場景下的特定問題而出現(xiàn)的,只有被正確應用了才有它的價值,而不要為了使用它而使用它。

至此,回調(diào)講解完畢,如有說明有誤的地方,歡迎各位批評指正。也歡迎大家繼續(xù)關注。

以上就是Java中的回調(diào)的詳細內(nèi)容,更多關于Java 回調(diào)的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
超碰超碰人人人人精品| 国产高清精品二区| 久久精品三级| 国产精品4hu.www| 国产亚洲一区二区三区啪| 日韩欧美中文在线观看| 日韩精品一区二区三区中文在线| 免费在线看一区| 国产美女一区| 中文字幕av一区二区三区四区| 蜜桃av一区二区在线观看| 中文精品电影| 日韩av成人高清| 国产精品日韩精品中文字幕| 国产精品美女午夜爽爽| 久久影视三级福利片| 国产成人久久精品一区二区三区| 国产一区二区精品久| 日韩精品dvd| 精品一区在线| 麻豆国产91在线播放| 国产欧美一区二区三区精品酒店| 日韩精品欧美激情一区二区| 欧美日韩国产高清| 国产精品日韩久久久| 日本特黄久久久高潮| 麻豆国产91在线播放| 日本精品在线中文字幕| 中文久久精品| 青草综合视频| 美女精品一区二区| 99成人在线视频| 婷婷综合五月| 日韩高清不卡在线| 中文在线а√天堂| 丝袜美腿成人在线| 国产剧情一区| 久久九九99| 最新国产精品久久久| 国产福利一区二区精品秒拍 | 捆绑调教美女网站视频一区| 国产va在线视频| 尤物在线精品| 国产精品亚洲产品| 另类中文字幕国产精品| 在线精品观看| 激情中国色综合| 美女久久一区| 精品中文在线| 美女尤物久久精品| sm久久捆绑调教精品一区| 日韩一级精品| 美女久久久久久 | 欧美片第1页综合| 97精品国产福利一区二区三区| 在线视频免费在线观看一区二区| 正在播放日韩精品| 欧美另类综合| 久久99国产精品视频| 亚洲精品网址| 久久精品天堂| 国产偷自视频区视频一区二区| 国产精品久久777777毛茸茸| 国内亚洲精品| 欧美一区二区三区久久精品| 久久狠狠婷婷| 国产精品国码视频| 不卡一区综合视频| 国产日产精品_国产精品毛片 | 亚洲精品在线a| 精品国产免费人成网站| 一区二区日韩免费看| 97精品国产| 欧美一区精品| 国模 一区 二区 三区| 欧美激情亚洲| 日韩在线观看中文字幕| 久久九九精品| 欧美国产不卡| 亚洲人成在线影院| 在线日韩av| 国产91欧美| 中文字幕亚洲精品乱码| 日本精品黄色| 国产亚洲久久| 亚洲精品日本| 激情婷婷久久| av在线最新| 美女视频免费精品| 欧美一区免费| 男女激情视频一区| 黄色精品网站| 亚洲va在线| 国产精选在线| 精品欧美视频| 国产精品日韩精品中文字幕| 亚洲精品婷婷| 欧美日韩精品一本二本三本| 国产精品国产三级国产在线观看| 欧美日韩18| 四虎在线精品| 蜜桃视频一区二区三区| 91久久国产| 亚洲天堂久久| 久久久久久免费视频| 日韩一区二区中文| 福利精品一区| 男人的天堂亚洲一区| 美女久久一区| 久久亚洲图片| 亚洲精品一区二区在线看| 日本在线精品| 国产美女高潮在线| 国产suv精品一区| 国产在线一区不卡| 精品国产一区二区三区2021| 国产精品亚洲综合色区韩国| 日本欧美韩国一区三区| 亚洲精品字幕| 少妇精品久久久一区二区三区| 国产视频欧美| 午夜久久久久| 国产精品美女| 亚洲视频播放| 国产精品日本| 亚洲一级大片| 日本aⅴ免费视频一区二区三区| 亚洲综合精品四区| 伊人久久大香线蕉av超碰演员| 99视频一区| 久久一二三区| 日本不卡的三区四区五区| 日本精品一区二区三区在线观看视频| 日本伊人久久| 久久国产免费看| 国产日韩欧美一区在线| 久久国产精品美女| 精品久久91| 日韩一区自拍| 亚洲精品网址| 亚洲精品美女91| 国产精品地址| 美女久久久久久| 高清av一区二区三区| 日韩成人高清| 国产精品美女久久久浪潮软件| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲影院天堂中文av色| 久久狠狠亚洲综合| 国产va免费精品观看精品视频| 欧美久久天堂| 1024精品一区二区三区| 亚州av乱码久久精品蜜桃| 男女激情视频一区| 欧美日韩午夜| 精品国产精品国产偷麻豆| 国产亚洲毛片| 蜜臀av亚洲一区中文字幕| 国产精品一区亚洲| 桃色av一区二区| 国产精品腿扒开做爽爽爽挤奶网站| 日韩精品免费一区二区夜夜嗨| 久久尤物视频| 午夜日韩av| 国产精品一区高清| 综合日韩av| 蜜臀av一区二区三区| 国产精品tv| 久久久影院免费| 亚洲另类av| 精品午夜久久| 9色国产精品| 欧美一区成人| 日韩精品1区| 亚洲欧美在线专区| 精品亚洲免a| 在线综合亚洲| 狂野欧美性猛交xxxx| 五月精品视频| 欧美成人精品午夜一区二区| 国产探花一区| 伊人影院久久| 精品国产99| 免费在线欧美视频| 久久久久久色 | 中文字幕系列一区| 午夜天堂精品久久久久| 欧美国产小视频| 免费观看在线色综合| 免费在线日韩av| 国产精品丝袜xxxxxxx| 精品国产亚洲日本| 综合一区在线| 日韩久久精品网| 欧美日韩国产高清| 精品视频自拍| 亚洲精品福利| japanese国产精品| 日本一二区不卡| 久久国产三级精品|