Java中的回调机制

2018-07-24  本文已影响18人  sunpy

调用方式

例子:

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

上一篇 下一篇

猜你喜欢

热点阅读