调用方式
例子:
a -> b
class A {
void a() {
···
new B().b();
···
}
}
class B {
void b(){}
}
同步调用情况
同步调用是最简单的方式,按照顺序,a调用b,当b执行完,那么a才会继续往下执行。如果b一直在执行,那么a将处于阻塞。这种情况适用于整个流程顺畅,不会出现执行时间过长的情况。不适于中间出现执行时间过长,导致整体性能下降,一部分代码长时间无法执行。
异步调用情况
异步调用就是为了避免出现同步调用阻塞的情况的。当a调用b,不管b执行多长时间,都会继续向下执行a的代码。当b执行完将通知a(a监听b的操作),做哪些操作就是回调。
回调
a -> b -> a (callback)
流程解释:
① 首先A类中a方法调用B类中的b方法。
② 然后B类中的b方法执行完毕,再执行A类中的callback方法。
注意:回调的关键是将自己的引用传递过去。可以看出回调的形式,是两个方法间的双向调用。而不使用回调,只是单方向调用。
举例:
快递员派送获取到客户手中,流程快递员通知客户快递送到丰巢了,然后客户领取到快递后,确认了快递员派送成功的单子。
回调接口:
public interface ICallback {
public void confirmOrder(String confirmMsg);
}
快递员:
public class Sender implements ICallback{
private ICustomer iCustomer;
public Sender(ICustomer iCustomer) {
this.iCustomer = iCustomer;
}
public void informCustomer() {
iCustomer.getGoods(this);
}
@Override
public void confirmOrder(String confirmMsg) {
System.out.println("快递员收到的订单回复信息:" + confirmMsg);
}
}
客户接口:
public interface ICustomer {
public void getGoods(ICallback iCallback);
}
具体客户A:
public class CustomerA implements ICustomer{
@Override
public void getGoods(ICallback iCallback) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
iCallback.confirmOrder("客户A已经确认订单");
}
}
测试类:
public class CallbackTest {
public static void main(String[] args) {
ICustomer customerA = new CustomerA();
Sender sender = new Sender(customerA);
sender.informCustomer();
}
}
运行结果:
1.jpg
回调机制在设计模式的应用:
我的博客 - 观察者模式:
https://blog.csdn.net/ya_1249463314/article/details/52444310
网友评论