171201之Java回调机制

所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。

三种:同步调用、异步调用,回调
同步调用

是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。这种调用方式适用于方法b()执行时间不长的情况,因为b()方法执行时间一长或者直接阻塞的话,a()方法的余下代码是无法执行下去的,这样会造成整个流程的阻塞。

异步调用

是为了解决同步调用可能出现阻塞,导致整个流程卡住而产生的一种调用方式。类A的方法方法a()通过新起线程的方式调用类B的方法b(),代码接着直接往下执行,这样无论方法b()执行时间多久,都不会阻塞住方法a()的执行。但是这种方式,由于方法a()不等待方法b()的执行完成,在方法a()需要方法b()执行结果的情况下(视具体业务而定,有些业务比如启异步线程发个微信通知、刷新一个缓存这种就没必要),必须通过一定的方式对方法b()的执行结果进行监听。在Java中,可以使用Future+Callable的方式做到这一点。

最后是回调,回调的思想是:

类A的a()方法调用类B的b()方法,类B的b()方法执行完毕主动调用类A的callback()方法,也就是一种双向的调用方式。

案例:
有如下这样场景:有一位老板很忙,他没有时间盯着员工干活,然后他告诉自己的雇员,干完当前这些事情后,告诉他干活的结果。

首先创建一个回调接口,让老板得告知干完活如何找到他的方式:留下老板办公室地址:

/** 
 * 此接口为联系的方式,不论是电话号码还是联系地址,作为 
 * 老板都必须要实现此接口 
 * @author Administrator 
 * 
 */  
public interface CallBackInterface {    
    public void execute();  
} 

创建回调对象,就是老板本人,因为员工干完活后要给他打电话,因此老板必须实现回调接口,不然员工去哪里找老板?

/** 
 * 老板是作为上层应用身份出现的,下层应用(员工)是不知道 
 * 有哪些方法,因此他想被下层应用(员工)调用必须实现此接口 
 * @author Administrator 
 * 
 */  
public class Boss implements CallBackInterface {       
    @Override  
    public void execute() {  
        System.out.println("收到了!!" + System.currentTimeMillis());           
    }  
}  

创建控制类,也就是员工对象,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板。

/** 
 * 员工类,必须要记住,这是一个底层类,底层是不了解上层服务的 
 * @author Administrator 
 * 
 */  
public class Employee {   
    private CallBackInterface callBack = null;  
    //告诉老板的联系方式,也就是注册  
    public void setCallBack(CallBackInterface callBack){  
        this.callBack = callBack;  
    }        
    //工人干活  
    public void doSome(){  
        //1.开始干活了  
        for(int i=0;i<10;i++){  
            System.out.println("第【" + i + "】事情干完了!");  
        }            
        //2.告诉老板干完了  
        callBack.execute();  
    }  
}  

测试类代码:

public class Client {  
    public static void main(String[] args) {  
        Employee emp = new Employee();  
        //将回调对象(上层对象)传入,注册  
        emp.setCallBack(new Boss());     
        //开启控制器对象运行  
        emp.doSome();  
    }    
}  

我们现在可以想象Filter和Interceptor的区别了,这两者其中最大的一个区别是Filter是基于回调函数,需要容器的支持,没有容器是无法回调doFilter()方法,而Interceptor是基于Java的反射机制的,和容器无关。

总之,要明确的一点是,首先要搞清回调函数出现的原因,也就是适用场景,才能搞清楚回调机制,不然事倍功半。

先创建个回调接口,再创建个回调对象(实现回调接口),然后再创建个控制类,测试类中创建个回调对象,然后将回调对象传入注册emp.setCallBack(new Boss()),最后开启控制器对象运行

总结:同步调用异步调用回调,回调的代码演示,Filter和Interceptor的区别。
参考博客:http://blog.csdn.net/pi9nc/article/details/23169357

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值