所谓的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();
    }
}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓chen的大键哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值