欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

到底什么是回调

程序员文章站 2022-05-19 13:16:31
...

到底什么是回调?

这个问题从我入门编程开始就一直不得其解,今天看到了一篇博客终于能理解了点回调的思想。
生动形象了讲解了回调
看完上面那篇博客,我个人对回调的理解就是A中调用B的方法C,B中的方法C又调用了A中的方法D

关于回调接口

看完上面那篇博客,很多人认为其实A是没有必要实现CallBack<>这个接口的,直接在B方法的参数列表中声明A的类型即可,这样也能做到B中方法C调用A的方法D。
当我自己编写代码实现回调时,我发现JDK下的回调接口CallBack空空如也

public interface Callback { }

我由此得出自己的理解:
如果一个类希望在调用别的类的方法下自己的方法又被调用,那么就实现这个接口进行声明,我认为就是起到声明的作用,同时方便我们面向接口编程。

回调的作用?

关于A中C调用B的C方法,而B中调用A中的D方法,将代码中的逻辑翻译为生活中的话语就是:A发完消息,B处理完告诉A结果

同步回调与异步回调

在理解了回调的作用后,我们再来区分同步回调与异步回调的区别:

异步回调

一种类似消息或事件的机制,被调用方在函数在收到某种讯息或发生某种事件时,才去调用对方的函数,即通过异步消息进行通知。简单来说,类A的a()函数调用类B的b()函数,但是b()函数很耗时,不确定什么时候执行完毕,如果是同步调用的话会等b()执行完成后才往下执行回调类A中的函数,如果是异步回调的话调用了b()函数,虽然b()函数没有执行完,但仍然继续往下执行,为了完成这点,就需要另开一个线程了

public interface CallBack {//方便面向接口编程,声明为回调
    public void solve(String msg);
}

public class PersonB implements CallBack {

    PersonA a;

    public PersonB(PersonA a){
        this.a = a;
    }

    public void askQuestion(final String msg){
        System.out.println(msg);
        new Thread(new Runnable() {
            public void run() {
                a.executeMessage(PersonB.this);
            }
        }).start();

        System.out.println("=============================================");
    }



    public void solve(String msg) {
        System.out.println("PersonA的回复 " + msg);
    }
}
public class PersonA {

    public void executeMessage(CallBack back){
        System.out.println("有人打电话过来了,我有事先不接,等会打过去");
        try {
            Thread.sleep(TimeUnit.SECONDS.toSeconds(1));//异步回调会将需要执行的函数给新开辟的线程执行,然后执行调用者剩余的代码
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String resp = "您好!不好意思,刚才有事,现在你的事情解决好了";
        back.solve(resp);


    }

    public static void main(String[] args) {
        PersonB b = new PersonB(new PersonA());
        b.askQuestion("几点到?");
    }
}

几点到?
=============================================
有人打电话过来了,我有事先不接,等会打过去
PersonA的回复 您好!不好意思,刚才有事,现在你的事情解决好了

同步回调

同步回调:当调用者调用被调用方函数时,会同步阻塞直到完成

public interface CallBack {
    public void solve(String msg);
}

public class PersonB implements CallBack {

    PersonA a;

    public PersonB(PersonA a){
        this.a = a;
    }

    public void askQuestion(final String msg){//没有开启新线程,同步阻塞直到完成
        System.out.println(msg);
        a.executeMessage(PersonB.this);
        System.out.println("=============================================");
    }



    public void solve(String msg) {
        System.out.println("PersonA的回复 " + msg);
    }
}

public class PersonA {

    public void executeMessage(CallBack back){
        System.out.println("有人打电话过来了,我有事先不接,等会打过去");
        try {
            Thread.sleep(TimeUnit.SECONDS.toSeconds(1));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String resp = "您好!不好意思,刚才有事,现在你的事情解决好了";
        back.solve(resp);


    }

    public static void main(String[] args) {
        PersonB b = new PersonB(new PersonA());
        b.askQuestion("几点到?");
    }
}

几点到?
有人打电话过来了,我有事先不接,等会打过去
PersonA的回复 您好!不好意思,刚才有事,现在你的事情解决好了
=============================================