Java调用分为3种:同步调用,同步回调,异步回调

1.同步调用及平时常用的调用方式
2.回调在框架中使用较多,例如spring 的 AOP实现,servlet的拦截器实现
场景 老师布置完作业后提供一个回调方法,学生可以通过这个方法把执行情况汇报给自己的老师。
(回调使用的重点,不同的老师实现相同的回调接口,但是会有不同的实现,因此学生可以选择自己老师来进行汇报,这也是AOP通过反射调用相关方法的原理)
Java 模拟 : class A 实现一个接口 ,class B 调用接口 的方法 从而实现对class A 的调用

回调接口

public interface Callback { 
 public void taskResult(String name); 
 }

老师1实现回调接口

/** 
 * 学生必须知道老师的信息,才能回报任务情况,因此它必须实现回调接口 
 * 
 */ 
 public class Teacher1 implements Callback{ 
 @Override 
 public void taskResult(String name) { 
 // TODO Auto-generated method stub 
 System.out.println(“任务:”+name+”完成”); 
 } 
 }

学生执行任务,并使用回调方法汇报给老师
public class Student {

Callback callback= null; 
 //将老师的联系信息给学生 
 public void setCallback(Callback callback) 
 { 
 this.callback=callback; 
 } 
 public void doTask() 
 { 
 for(int m=1;m<6;m++) 
 { 
 callback.taskResult(m+”是张三”); 
 } 
 } 
 }

测试类:

public class CallbackTest { 
 public static void main(String[] args) { 
 // TODO Auto-generated method stub 
 Student student=new Student(); 
 //指定学生对应的老师 
 student.setCallback(new Teacher1()); 
 student.doTask(); 
 } 
 }

可以看到学生在执行完任务后,会调用对应老师的回调方法

3.异步回调:异步回调会新建一个线程执行回调的同时继续进行接下来的任务
场景:小王要问小李一个问题,小李思考答案的同时小王继续做自己的事情,在小李得到答案后调用小王的回调方法,通知小王答案。(同样注意的是 不同的小王有不同的回调函数,会执行不同的操作)
回调函数接口:

public interface CallBack { 
 /** 
 * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数 
 * @param result 是答案 
 */ 
 public void solve(String result); 
 } 
 小王实现回调函数的类,小李在得到答案后会调用小王的回调方法通知小王: 
 /** 
 * 这个是小王 
 * @author xiaanming 
 * 实现了一个回调接口CallBack,相当于—–>背景一 
 */ 
 public class Wang implements CallBack { 
 /** 
 * 小李对象的引用 
 * 相当于—–>背景二 
 */ 
 private Li li; 
 /** 
 * 小王的构造方法,持有小李的引用 
 * @param li 
 */ 
 public Wang(Li li){ 
 this.li = li; 
 } 
 /** 
 * 小王通过这个方法去问小李的问题 
 * @param question 就是小王要问的问题,1 + 1 = ? 
 */ 
 public void askQuestion(final String question){ 
 //这里用一个线程就是异步, 
 new Thread(new Runnable() { 
 @Override 
 public void run() { 
 /** 
 * 小王调用小李中的方法,在这里注册回调接口 
 * 这就相当于A类调用B的方法C 
 */ 
 li.executeMessage(Wang.this, question); 
 } 
 }).start(); 
 //小网问完问题挂掉电话就去干其他的事情了,诳街去了 
 play(); 
 } 
 public void play(){ 
 System.out.println(“我要逛街去了”); 
 } 
 /** 
 * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法 
 */ 
 @Override 
 public void solve(String result) { 
 System.out.println(“小李告诉小王的答案是—>” + result); 
 } 
 } 
 小李: 
 public class Li { 
 /** 
 * 相当于B类有参数为CallBack callBack的f()—->背景三 
 * @param callBack 
 * @param question 小王问的问题 
 */ 
 public void executeMessage(CallBack callBack, String question){ 
 System.out.println(“小王问的问题—>” + question); 
 //模拟小李办自己的事情需要很长时间 
 for(int i=0; i<10000;i++){ 
 } 
 /** 
 * 小李办完自己的事情之后想到了答案是2 
 */ 
 String result = “答案是2”; 
 /** 
 * 于是就打电话告诉小王,调用小王中的方法 
 * 这就相当于B类反过来调用A的方法D 
 */ 
 callBack.solve(result); 
 } 
 } 
 写一个测试类: 
 public class Test { 
 public static void main(String[] args) { 
 Li li = new Li(); 
 Wang wang = new Wang(li); 
 wang.askQuestion(“1 + 1 = ?”); 
 } 
 }