电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java中的回調

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

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

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

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

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

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

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

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

先定義一個接口:.

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

定義一個Boss類實現這個接收報告的接口:

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 報告內容 */ 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 = '我已經完成了任務!'; 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 的報告:我已經完成了任務!

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

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

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

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

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

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

/** * @author Frank * @create 2017/12/3 * @description 接收報告接口 */public interface ReceiveReport { /** * 接收報告 * @param worker 員工 * @param report 報告內容 */ 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+'由于表現突出,獲得$'+money+'現金獎勵!'); } /** * 工作 * @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 報告內容 */ public void receiveReport(Worker worker,String report){ int index = ++this.index; System.out.println(worker.getName()+'獲得第'+index+'名'); if (index <= 3){ //給前三名發獎金 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'); }}

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

程序執行結果如下:

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]由于表現突出,獲得$3000.0現金獎勵!Employee[7]獲得第2名Employee[7]由于表現突出,獲得$2000.0現金獎勵!Employee[3]獲得第3名Employee[3]由于表現突出,獲得$1000.0現金獎勵!Employee[1]獲得第4名Employee[0]獲得第5名Employee[5]獲得第6名Employee[4]獲得第7名Employee[8]獲得第8名Employee[6]獲得第9名Employee[2]獲得第10名

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

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

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

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

以上就是Java中的回調的詳細內容,更多關于Java 回調的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 茶叶百科网-茶叶知识与茶文化探讨分享平台 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 数控走心机-走心机价格-双主轴走心机-宝宇百科| 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 |