函数回调机制、异步函数回调机制图例详解
2016-07-29 20:10
323 查看
函数回调机制,一种双向调用思想,简单来说就是,如下图所示:
在层次一中的方法一(函数)调用层次二中的方法,并传入函数二的地址,而这个被调用的方法又会调用层次一中的方法,这个最后被调用的方法二就是回调方法。方法三调用方法二就是回调的过程。一个有意思的例子,大家可以先感受一下:“诸葛亮给赵子龙一个锦囊,吩咐他危急时打开按锦囊指示办, 锦囊里的命令就是回调函数,危急时刻就是回调的时机。”
在Java中,这个“层次”可以理解为类,是两个类互相调用对方的方法;也可以理解为应用类(高层)调用类库方法(低层),并传入一个自定义的方法以完成某些功能。
说到“调用”,模块之间总是存在这一定的接口,模块之间通过这些接口调用以通信联系,从调用方式上看,可以分为三类:同步调用、回调和异步调用。
同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;
回调是一种双向的调用模式;
异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。回调是异步调用的基础。下面以一个网络上很流行的例子为基础,理解异步回调机制。
异步回调典型例子:
提问者A有个问题"1+1=?",于是A打电话给回答者B,B说他现在很忙,忙完了才能给他想答案,A心想我不能这么一直等着把,于是说:“那咱们约定好,B你想出答案了以打电话的形式告诉我”,挂了电话A也去忙他自己的事了,过了一会B想出答案按A约定好的方式打电话告诉了B答案。
下面以代码形式描述这个过程:
(例子原版源自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273))
执行结果:
函数回调机制也应用于钩子方法,这个可以参考博客:点击打开链接
在层次一中的方法一(函数)调用层次二中的方法,并传入函数二的地址,而这个被调用的方法又会调用层次一中的方法,这个最后被调用的方法二就是回调方法。方法三调用方法二就是回调的过程。一个有意思的例子,大家可以先感受一下:“诸葛亮给赵子龙一个锦囊,吩咐他危急时打开按锦囊指示办, 锦囊里的命令就是回调函数,危急时刻就是回调的时机。”
在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调用 */ @Override public 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))
执行结果:
函数回调机制也应用于钩子方法,这个可以参考博客:点击打开链接
相关文章推荐
- 架构模式--函数回调机制、异步函数回调机制图例详解
- 深入浅出Java回调机制 / 回掉函数 / 深入浅出理解 Java回调机制(异步) GOOD
- 异步消息的传递-回调机制
- 回调函数详解
- 异步消息的传递-回调机制
- 回调与异步机制
- 回调机制详解
- 研究一下JavaScript的函数回调机制
- 异步消息的传递-回调机制
- C++中 函数,函数模板,函数对象,函数对象模板 与 回调机制 不得不说的事
- 异步消息的传递之回调机制
- 异步消息的传递-回调机制
- 异步消息的传递-回调机制
- 异步消息的传递-回调机制
- 异步消息的传递-回调机制
- 回调函数详解
- 回调函数详解
- 异步消息的传递-回调机制
- 转载NET体系下的回调与异步调用之委托与事件机制
- 详解Java回调机制 (Callback) --讲解+实例