最近有个新同事给我写了个接口,说是用到了回调,我等了半天发现结果才返回回来,把我都整急了。最后我看了他的代码,目瞪口呆。他还信誓旦旦的说没错,按网上的例子来写的。

我一搜,网上例子真一大堆,并且都尼玛差不多。

首先,定义写的不错:经理A下班前打电话给程序猿B,叫他加班搞定一个项目,然后经理A就挂了电话,程序猿B加班搞定了整个项目,并打电话告诉了经理A。程序猿B将结果告诉经理A的这个行为就是回调。

网上有句话叫做什么?应聘造就面试人才!!!这句话真的没错。。。先来看他们的demo(大致如下面写的):

ClassA.java(表示经理A)
package com.example.demo1.dto;public class ClassA {public static void sendCommand(String command){ClassB.acceptCommand(command);}public static void callBack(String str){System.out.print(str);}
}

ClassB.java(表示程序猿B)

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");doSomething(command);ClassA.callBack("命令【"+command+"】执行完毕!\n");}public static void doSomething(String command){System.out.print("正在执行命令:"+command+"\n");}
}

执行结果:

然后再接着还进行了一些抽象封装。

看到上面,我要是经理A,我肯定让你将代码提交一下,然后告诉你不用来上班了!我是卸磨杀驴吗?不是,是你技术太渣!

为什么这么说呢?明明下了命令后我是是可以约妹子去聊聊人生,聊聊理想的。结果呢,丫的,下了命令,却不能挂电话,还得听你在那啰里吧嗦的,直到你说搞好了。。。

怎么是这样呢?明明用了回调函数呀!但你有没有发现,你这回调函数用的,跟直接return 没有区别,也就是ClassA.callBack("命令【"+command+"】执行完毕!\n");跟直接 return "命令【"+command+"】执行完毕!\n";的效果一样!!

我将定义抽象一下,A向B发送请求,B由于执行时间比较长,无法立刻知道结果,就只是告诉A收到你的请求了,然后埋头干活,干完后,再通知A最终的结果。

这个例子写得是像模像样的,但关键是没整明白,回调主要是用在异步上面,像这样用在同步上面,就没什么意义了。

那该如何改了,很简单,将ClassB.java改一下就好了,更改后代码如下:

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");new Thread(new Runnable() {@Overridepublic void run() {System.out.print("正在执行命令:"+command+"\n");ClassA.callBack("命令【"+command+"】执行完毕!\n");}}).start();ClassA.callBack("收到命令【"+command+"】了,马上开始执行!\n");}
}

执行结果如下:

通过这个,效果就达到了。经理A下班前打电话给程序猿B,叫他加班搞定一个项目,程序猿B说:“收到,马上开干!”,然后经理A挂了电话就约妹去了。然后程序猿B干完了之后,给经理A回了一个电话:"搞定了!"。经理A一想,小伙子靠谱啊,看来得给你加薪了,免得被人挖走了。

至于抽象封装就自己搞定哈。

在同一个服务中,上面的回掉是没有任何问题的,但如果是跨系统跨服务,那么该怎么实现回掉呢,毕竟你的class和方法别人是无法拿的到的。这时候,一般可以采用消息推送。IM即时通信系统,推送是很简单的,其他系统,也可以采用消息中间件MQ进行结果的推送,当然,最简单的是增加一个参数,让A请求的时候带上回掉的URL,然后B处理完后,通过Httpclient调用该URL将结果通知A。像微信公众号的模板消息,群发消息结果的通知就是这么干的。

总之,回调是一种思想,不要拘泥于形式。

java回调函数(callBack)相关推荐

  1. Java 回调函数Callback

    参考:http://blog.csdn.net/fengyifei11228/article/details/5729445 http://kidult.iteye.com/blog/148982 所 ...

  2. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  3. 服务器响应回调函数,解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)...

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  4. [实战]java回调函数

    下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: java 代码 public   class  TestObject { /** ...

  5. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  6. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  7. java回调函数的生命_Java车票,车站,生命周期,龟兔赛跑,同步锁,礼让,守护线程,挖金矿【诗书画唱】...

    个人理解:加同步锁等的时候,就可以让线程"按顺序排队",一个一个地抢CPU,一个抢完对应的每次有的CPU了,另一个才抢对应的每次有的CPU,解决"并发"问题等. ...

  8. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  9. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({url:"test.json",type: "GET", ...

  10. linux callback函数,C++回调函数(callback)的使用

    什么是回调函数(callback) 模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让 ...

最新文章

  1. 【linux】用户和组的管理:添加、修改、删除(useradd usermod userdel groupadd groupdel)
  2. 102. 最佳牛围栏【二分 / 思维 不错】
  3. 十八个超经典故事 绝对不会后悔
  4. WinMerge软件的使用
  5. expect() php,Linux expect 的安装
  6. hadoop2.6.0+eclipse配置
  7. Java中泛型Class《T》、T与Class《?》
  8. 深度学习工程师能力评估标准
  9. rust油桶用什么打_火龙果用什么膨大剂好?果子增大用什么肥料?什么时候打膨大素?...
  10. SqlServer的代理问题
  11. 关于Big-Endian 和Little-Endian
  12. iphone查看删除的短信_手机里的短信不小心删除了怎么才能恢复?此文为你解答...
  13. 代理记账和专职会计哪个更适合企业?
  14. 德保罗大学计算机科学专业,德保罗大学专业排名介绍
  15. boss网人脸识别认证_老来网社保认证官网版app下载
  16. 数字化时代的车企信息化转型思考
  17. 我的jquery之路(二)
  18. 周志华机器学习(一)
  19. 中国计算机协会(CCF)
  20. 人机博弈 围棋程序GNU GO 所有版本源码及使用方法

热门文章

  1. symantec linux版命令,symantec backup exec 2010 linux客户端的配置
  2. 190403 联众验证码 - python3接入
  3. 前端优化 - 提高 Web 性能的 9 个技巧
  4. OA发票管理 发票验真 费用报销流程对接
  5. 看图计算机械加工工时,急求机械加工工艺编制和工时定额制定与核算软件!!!...
  6. Android系列之开发环境搭建
  7. 【韦东山嵌入式Linux】Linux命令进阶笔记
  8. 宅霸java_宅霸游戏联机平台下载|宅霸游戏联机平台免费版下载 v4.5.0 官方版_小皮网...
  9. 远程teamview下载网址,和ie 下载地址
  10. 算法设计与分析知识点整理