java回调机制原理解析

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

 



 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值