函数回调机制,一种双向调用思想,简单来说就是,如下图所示:

在层次一中的方法一(函数)调用层次二中的方法,并传入函数二的地址,而这个被调用的方法又会调用层次一中的方法,这个最后被调用的方法二就是回调方法。方法三调用方法二就是回调的过程。一个有意思的例子,大家可以先感受一下:“诸葛亮给赵子龙一个锦囊,吩咐他危急时打开按锦囊指示办, 锦囊里的命令就是回调函数,危急时刻就是回调的时机。”

在Java中,这个“层次”可以理解为类,是两个类互相调用对方的方法;也可以理解为应用类(高层)调用类库方法(低层),并传入一个自定义的方法以完成某些功能。

说到“调用”,模块之间总是存在这一定的接口,模块之间通过这些接口调用以通信联系,从调用方式上看,可以分为三类:同步调用、回调和异步调用

同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;

回调是一种双向的调用模式;

异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。回调是异步调用的基础。下面以一个网络上很流行的例子为基础,理解异步回调机制。

异步回调典型例子:

提问者A有个问题"1+1=?",于是A打电话给回答者B,B说他现在很忙,忙完了才能给他想答案,A心想我不能这么一直等着把,于是说:“那咱们约定好,B你想出答案了以打电话的形式告诉我”,挂了电话A也去忙他自己的事了,过了一会B想出答案按A约定好的方式打电话告诉了B答案。

下面以代码形式描述这个过程:

/** * 这是一个回调接口,里面定义的方法就是回调函数*/
public interface CallBack {/** * 这是一个回调函数,用于回答者B知道答案后给提问者A回电话,并告知提问者A答案是什么* 这个回电话的方式callBack是提问者A确定的,所以这个方法的实现类是A类* 这个回电话的内容result是回答者B提供的,所以这个变量的值是在B类中确定的*/ public void callBack(String result);
}
/** * 提问者A类*/
public class A implements CallBack{/** * 提问者A是知道回答者B的联系方式的* 这里以一个B类引用代表,并在构造方法中传入B实例对象*/ private B b;public A(B b){this.b = b;}/** * 提问者A向回答者B打电话提问题                    * 这里以一个call方法表示,并把问题参数传入*/ public void call(final String question){  /** * 建立提问者A线程,与回答者B线程结合,构成一个异步的环境*/ new Thread(new Runnable() {  @Override  public void run() {/** * B接电话,听问题* 这里以调用回答者B的answer方法表示,传入回调方法类参数、问题参数,以表示谁打的电话,问啥了 * 因为A类实现了CallBack接口,所以A类就是回调方法类,回调方法类实现了回调方法*/  b.answer(A.this, question);   }  }).start();            /** * 提问者提完问,去干别事情*/   doOtherThing();  }  public void doOtherThing(){System.out.println("我是提问者A,我问完问题就去干别的事情了!");}/** * 刚刚说到,这个回电话的方式callBack是提问者A确定的,所以这个方法的实现类是A类* 所以这里实现回调方法,代表回复的方法是回电话,由回答者B调用    */ @Overridepublic void callBack(String result) {System.out.println("B调用A定义的回调函数:回答者B告诉提问者A,问题的答案是:"+ result);}}
/*** 回答者B类*/
public class B {/*** 回答者B接电话,听问题 这里以调用回答者B的answer方法表示,传入回调方法类、问题参数,以表示谁打的电话,问啥了 */public void answer(CallBack callBack, String question) {System.out.println("A调用B的接电话方法:我是回答者B,提问者A问的问题是:" + question);/*** 模拟回答者B先忙自己的事 */System.out.println("我是回答者B,我接完电话先去忙我自己的事!");for (int i = 0; i < 100000; i++) {}String result = "2";System.out.println("我是回答者B,我知道了答案是:" + result);/*** 调用回调函数,打电话告知A答案是什么                      */callBack.callBack(result);}
}
/** * 场景测试类*/
public class test {public static void main(String args[]){/** * 实例化回答者B*/  B b = new B();/** * 实例化提问者A*/  A a = new A(b);/** * A向B提问,开始*/  a.call("1 + 1 = ?");        }
}

(例子原版源自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273))

执行结果:


函数回调机制也应用于钩子方法,这个可以参考博客: 点击打开链接

函数回调机制、异步函数回调机制图例详解相关推荐

  1. C++友元函数和友元类(C++ friend)详解

    在看VISP视觉库的时候遇到友元函数: Friends void swap (vpDetectorAprilTag &o1, vpDetectorAprilTag &o2) 在定义一个 ...

  2. php判断参数_php检查函数必传参数是否存在的实例详解

    php检查函数必传参数是否存在的实例详解 在php实际编程中,接口经常会接收到前端传来的参数,其中有些参数不是必传的,有些参数是必传的,如何"检查函数必传参数是否存在"呢?为了解决 ...

  3. SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

    SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller ...

  4. php根据元素返回可以,array_search()函数按元素值返回键名步骤详解

    这次给大家带来array_search()函数按元素值返回键名步骤详解,array_search()函数按元素值返回键名的注意事项有哪些,下面就是实战案例,一起来看一下. array_search() ...

  5. 小程序怎么处理轮训ajax,微信小程序中使用Promise进行异步流程处理的实例详解...

    微信小程序中使用Promise进行异步流程处理的实例详解 我们知道,JavaScript是单进程执行的,同步操作会对程序的执行进行阻塞处理.比如在浏览器页面程序中,如果一段同步的代码需要执行很长时间( ...

  6. php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解

    这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...

  7. 如何查看水表(图例详解)

    原文地址:如何查看水表(图例详解)作者:steven2632 水表一般红色的是小数位,黑色的是整数位,红字轮的不要管它,从黑字轮的x1000.x100.x10.x1开始看起,分别是千位.百位.十位和个 ...

  8. 面试题:函数回调机制、异步函数回调机制图例详解 没毛用

    函数回调机制,一种双向调用思想,简单来说就是,如下图所示: 在层次一中的方法一(函数)调用层次二中的方法,并传入函数二的地址,而这个被调用的方法又会调用层次一中的方法,这个最后被调用的方法二就是回调方 ...

  9. html里的回调函数的作用域,异步与回调/函数的作用域链

    异步与回调/函数的作用域链 JavaScript 只在一个线程上运行,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏 ...

最新文章

  1. linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制
  2. Jerry的Fiori原创文章合集
  3. Vue系列之搭建环境
  4. 16. go get
  5. javaWeb—9.Git
  6. 智慧工厂数字孪生建设方案
  7. pwm控制直流电机转速流程图_一例PWM直流电机转速控制器的电路图,附电路原理分析...
  8. 基于VUMAT复合材料夹层结构冲击仿真
  9. 平面多边形凹凸判断(叉乘法)
  10. Redis主从复制(Master/Slaver)初级
  11. 《指数基金投资指南》读书笔记_2022002
  12. Toontrack EZDrummer for Mac - 鼓音乐制作工具
  13. arch linux u盘安装,如何把ArchLinux安装到U盘上
  14. BIO,NIO,AIO区别
  15. 编写Outlook html邮件
  16. 用RSA算法加密文本文件
  17. 易科 Exact Globe Next 销售订单 请求日期(ETD)比发货日期提前5天
  18. 《明日世界》电驴下载放出
  19. easyexcel 列宽、行高、样式
  20. 装机员U盘启动PE制作工具V4.0(UEFI+UD)

热门文章

  1. vue3+element plus创建vue-cli脚手架工程
  2. 软件学院宣传视频制作日志——脚本的创作
  3. Pico Tobtoolservice使用文档_V4.2.2_20220927
  4. coturn 401 Unauthorized问题排查
  5. 学习的时候选择一本好书是多么重要
  6. AI绘画——Lora模型Fake Van Gogh Style(让梵高来画二次元美少女?)
  7. 计算机与信息技术研究生,心之所向,素履以往——访计算机与信息技术学院硕士研究生乔洁...
  8. android 11 固定WIFI热点路由器IP
  9. Jenkins在linux报错:PKIX path building failed: sun.security.provid...
  10. java 文件结束符 eof_文件结束符EOF .