您的位置:首页 > 编程语言 > Java开发

java回调机制原理解析

2013-07-26 13:40 204 查看
一般我们在java中常说起的回调大多是指方法的回调,方法回调以我的理解就是,一个类在调用另一个类的方法是,这个类的方法也会被另一个类调用的情形。

 

那么先了解一个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。要深入的了解和应用还是看看这些优秀的应用吧,绝对有惊喜。我这些例子也是从网上学习,望拍砖。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: