Java回调机制

在一个应用系统必然存在模块间的相互调用(无论是什么语言实现的),模块间调用分为以下几种:

同步调用

同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。
原理图如下所示:
同步调用

这种调用方式适合b()方法执行时间不长的情况,若b()方法执行时间太长,则会导致a()方法中余下的代码无法执行,这样会使整个流程阻塞。

异步调用

异步调用是为了解决同步调用可能出现阻塞,导致整个流程卡住而产生的一种调用方式。类A的方法方法a()通过新起线程的方式调用类B的方法b(),代码接着直接往下执行,这样无论方法b()执行时间多久,都不会阻塞住方法a()的执行。
原理图如下:
异步调用

如果方法a()需要b()方法的执行结果,那还需要设置额外的监听方法对b()方法执行结果进行监听,在Java多线程编程中,可以使用Future+Callable的方式做到这一点。

回调

回调的思想是类A的a()方法调用类B的b()方法,当b()方法执行完之后主动调用类A的callback()方法。
原理图如下:
回调

回调分为同步回调和异步回调。回调是一种思想、是一种机制,其核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。

同步回调

具体写法如下:

//回调接口
public interface CallbackListener {
    void callBack(String msg);
}
//回调接口实现类
public class A implements CallbackListener {
    public A(){
        B b = new B();
        b.b(this);
        System.out.println("我调用了B类的b()方法");
    }
    /** 实现接口 */
    public  void callBack(String str){
        System.out.println(str);
    }
}
//调用类
public class B {
    public void b(CallbackListenter callBack){
        System.out.println("我被调用了");
        callBack.callBack("调用回调方法");
    }
}
//主程序
public class Main {
    public static void main(String[] args) {
        new A();
    }
}

从上面的代码可以看出同步回调实现其实很简单,再细心一看,会发现同步回调机制跟同步调用执行顺序是一样的,所以同步回调机制是同步调用的其中一种实现。

异步调用

不同于同步调用,异步调用在新线程中进行调用,执行完成之后再调用回调方法。相关代码如下:

//回调接口
public interface CallbackListener {
    void callBack(String msg);
}
//回调接口实现类
public class A implements CallbackListener {
    public A(){
        B b = new B();
        b.b(this);
        System.out.println("我调用了B类的b()方法");
    }
    /** 实现接口 */
    public  void callBack(String str){
        System.out.println(str);
    }
}
//调用类
public class B {
    public void b(CallbackListenter callBack){
        Thread thread = new Thread(){
            @Override
            public void run(){
                try {
                    sleep(2000);
                    System.out.println("我被调用了");
                    callBack.callBack("调用回调方法");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();
    }
}
//主程序
public class Main {
    public static void main(String[] args) {
        new A();
    }
}

异步回调与同步回调最大的区别就是异步回调多开了新线程来执行。

回调的概念其实不难,难在怎么在设计中灵活的运用

全部评论

相关推荐

头像
点赞 评论 收藏
转发
头像
05-12 09:14
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务