模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用
1.同步调用是一种阻塞式调用,也是我们在写程序中经常使用的
2.回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口
3.异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题
举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走
同步和异步机制的出现不必多说,大家心知肚明,那回调机制为什么会出现呢?在我们现实生活中,有如下这样场景:有一位老板很忙,他没有时间盯着员工干活,然后他告诉自己的雇员,干完当前这些事情后,告诉他干活的结果。这个例子其实是一个回调+异步的例子,再举一个例子,A程序员写了一段程序a,其中预留了回调函数接口,并封装好了该程序,程序员B让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法,到这里你可能似懂非懂了,后面会继续说明回调的出现原因。接下来我们把上面例子变成代码,看到网上很多人最后搞混了异步和回调,因此例子中不加入异步调用。(注意:回调可不是解决什么调用时间过长问题,那是异步!)
首先创建一个接口:老板需要在员工干完活之后被通知到
public interface CallBackInterface {
public void solve(String str);
}
创建回调对象:老板,因为员工干完活后要电话老板告诉他活已经干完
/**
* 老板是作为上层应用身份出现的,下层应用(员工)是不知道 有哪些方法,因此他想被下层应用(员工)调用必须实现此接口
*/
public class Boss implements CallBackInterface{
private Employee employee;
public Boss(Employee employee) {
this.employee = employee;
}
//boss吩咐员工做事
public void tellToDo(String str){
System.out.println("boss吩咐员工"+str);
employee.doThing(this, str);
}
//员工做完之后,回调此方法告诉boss事情已近刚做完
@Override
public void solve(String str) {
System.out.println("员工做完之后,回调此方法告诉Boss");
}
}
创建控制对象:员工,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板
public class Employee{
public void doThing(CallBackInterface callBackInterface,String str){
System.out.println("员工干活:"+str+"干完之后,通知Boss做好了");
callBackInterface.solve(str);
}
}
代码测试
public class TestCallBack {
public static void main(String[] args) {
Employee employee = new Employee();
Boss boss = new Boss(employee);
boss.tellToDo("拖地");
}
}
执行结果
boss吩咐员工拖地
员工干活:拖地干完之后,通知Boss做好了
员工做完之后,回调此方法告诉Boss