java回调机制原理解析
2013-07-26 13:40
204 查看
一般我们在java中常说起的回调大多是指方法的回调,方法回调以我的理解就是,一个类在调用另一个类的方法是,这个类的方法也会被另一个类调用的情形。
那么先了解一个java回调机制的概念:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。
了解概念后,我们来运用实例来更加深入的了解java回调机制。
这种实例网上很多,下面就写一个java回调的简单实例。
比如有这样一种情景:一个学生在学习中遇到一个问题,他自己搞不定,怎么办呢,这时候他决定向教授请教,所以他爸把问题反馈给教授了,这时候教授不可能马上就能把问题给解决了啊,他就告诉学生你先回去,等我解决了回头我告诉你啊。就这样学生回去了,等老师的答案。从问题中我们可以看出,根据现实具体情况,学生不是一直等着教授
把问题做完,而是回去干别的事等消息了,这是个异步的情景。首先思路:他给老师提出了一个问题,老师解决这个问题可能需要花一段时间,所以学生拜访后就回去做自己的
事情去了,在家等老师的消息。对就是这样。
首先定义一个回调方法的接口:CallBack,里面定义了一个用于返回教授解决问题的答案。
然后定义一个被调用者,即解决问题的Teacher类,提供解决学生提出的疑问。
其次需要定义一个学生类,来向教授提出解决问题。提出解决问题等待,接收反馈问题的答案。这时候需要实现CallBack的方法,这是重点啊,细品请看代码吧!
1.回调方法
2.被调用者,老师回调了学生的回调方法
3.调用者,学生调用老师的实例方法
通过上面的实例大家差不多应该大致了解了java回调的机制了吧。上面代码我觉得重点是student类实现了回调接口,student类里调用老师的方法的同事,由于传入的传入是Callback接口,这是student又实现了这个接口。所以根据java父类的引用指向子类的实例。就可以很方便的调用回调方法。就这样实现方法的回调。
其实在很多框架中都使用了回调的机制,比如android,和spring。要深入的了解和应用还是看看这些优秀的应用吧,绝对有惊喜。我这些例子也是从网上学习,望拍砖。
那么先了解一个java回调机制的概念:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。
了解概念后,我们来运用实例来更加深入的了解java回调机制。
这种实例网上很多,下面就写一个java回调的简单实例。
比如有这样一种情景:一个学生在学习中遇到一个问题,他自己搞不定,怎么办呢,这时候他决定向教授请教,所以他爸把问题反馈给教授了,这时候教授不可能马上就能把问题给解决了啊,他就告诉学生你先回去,等我解决了回头我告诉你啊。就这样学生回去了,等老师的答案。从问题中我们可以看出,根据现实具体情况,学生不是一直等着教授
把问题做完,而是回去干别的事等消息了,这是个异步的情景。首先思路:他给老师提出了一个问题,老师解决这个问题可能需要花一段时间,所以学生拜访后就回去做自己的
事情去了,在家等老师的消息。对就是这样。
首先定义一个回调方法的接口:CallBack,里面定义了一个用于返回教授解决问题的答案。
然后定义一个被调用者,即解决问题的Teacher类,提供解决学生提出的疑问。
其次需要定义一个学生类,来向教授提出解决问题。提出解决问题等待,接收反馈问题的答案。这时候需要实现CallBack的方法,这是重点啊,细品请看代码吧!
1.回调方法
package com.util.callback; /** * 回调接口,提供反馈答案方法 * @author test * */ public interface CallBack { public void toAnswer(String result); }
2.被调用者,老师回调了学生的回调方法
package com.util.callback; /** * * 用于解决问题,并反馈答案 * @author test * */ public class Teacher { public void executeMessage(CallBack callback,String question) { System.out.println("解决学生的:"+question+"中..."); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } String result="答案是10000"; System.out.println(result); callback.toAnswer(result); } }
3.调用者,学生调用老师的实例方法
package com.util.callback; public class Student implements CallBack { private Teacher teacher; public Student(Teacher tea) { this.teacher=tea; } //学生提出问题:100*100=? public void askQuestion(final String question) { System.out.println("这个题目做不到:"+question+",向老师寻求问题答案"); new Thread(new Runnable(){ public void run() { teacher.executeMessage(Student.this, question); } }).start(); System.out.println("老师我要出去吃饭了,挂了啊,等你答案"); playOther(); } //打完电话吃饭去了 public void playOther() { System.out.println("出去吃饭..."); } //回调方法,等待老师的答案 public void toAnswer(String result) { System.out.println("老师的答案:"+result); } }
4.test mian() package com.util.callback; public class Test { public static void main(String [] args) { Teacher teacher=new Teacher(); Student student=new Student(teacher); student.askQuestion("100 * 100 = ?"); } }
通过上面的实例大家差不多应该大致了解了java回调的机制了吧。上面代码我觉得重点是student类实现了回调接口,student类里调用老师的方法的同事,由于传入的传入是Callback接口,这是student又实现了这个接口。所以根据java父类的引用指向子类的实例。就可以很方便的调用回调方法。就这样实现方法的回调。
其实在很多框架中都使用了回调的机制,比如android,和spring。要深入的了解和应用还是看看这些优秀的应用吧,绝对有惊喜。我这些例子也是从网上学习,望拍砖。