回调函数的理解

回调函数的理解回调函数的理解

大家好,又见面了,我是你们的朋友全栈君。

把A理解成客户端,把B理解成服务器。
A要访问B,让B做事。但是B做的慢,于是B就先返回给A一个正在处理的状态,等处理完了再通知A处理结果,那么这个A通知B的手段就是回调了。通常为了加强适配性(因为服务器只有一个,而客户端有多个),客户端都会实现接口C,再把C注入到服务器,那么服务器对外提供带有参数C的方法即可。

还有一种形式的回调,就是让服务方提供方法,在里面可以写自己的实现内容,再回调执行。
如线程,我们先new Thread,并在里面写run方法,最后再调用start方法启动。这里的start方法里面的实现也是一种回调。
最后是常见的内部类实现的一种回调形式。还是创建一个线程,
Thread t1=new Thread(new Runnable (){

public void run(){

//自己的要做的事
}
});

//回调执行里面的run方法
t1.start();

这里thread是别人写好的类,我们要使用,为了更灵活,thread提供了个是接口类型的参数,让我们自己去写里面的实现内容。写好后再回调执行。别人写的线程提供很多方法,可以编辑线程名字,查看线程状态,终止线程等功能,很方便。我想这也是为什么要使用回调的原因了。如果不使用,我们也可以自己写方法,一步步执行,但自己写的毕竟不如人家专业的

案例 :

public class test5 { 
   
    public static void main(String[] args) { 
   
        //*********************回调1*******************8
        Server server=new Server();
        Client client=new Client();
        client.server=server;
        client.num=1;
        client.call();
        //*********************回调2*******************
        Server3 server3=new Server3();
        server3.num=1;
        int num3=3;
        server3.callFunc(num3, new ClientInter() { 
   
            @Override
            public void back() { 
   
                server3.num+=num3;
                System.out.println(server3.num);
            }
        });
        //回调,执行我们自己写的callFunc
        server3.call();
        System.out.println("server3的num:"+server3.num);
    }
}
interface  ClientInter{ 
   
    public void back();
}
class Client implements ClientInter{ 
   
    Server server;
    int num;
    public void call(){ 
   
        num+=5;
        //让服务器做事
        boolean flag=server.chuli(Client.this);
        System.out.println("服务器还在处理,先返回调用是否成功的状态:"+flag);
    }

    @Override
    public void back() { 
   
        System.out.println("服务器处理完了,回到客户端了");
        //还有再把num+5
        num+=5;
        System.out.println("客户端如果num是11,那么回调成功:"+num);
    }
}
class Server{ 
   
    public boolean chuli(ClientInter clientInter){ 
   
        new Thread(()->{ 
   
            System.out.println("服务器开始处理!!!需要5s");
            try { 
   
                Thread.sleep(5000);
            } catch (InterruptedException e) { 
   
                e.printStackTrace();
            }
            clientInter.back();
        }).start();
        return true;
    }
}

class Server3{ 
   
    int num;
    private ClientInter clientInter;
    public void callFunc(int num,ClientInter clientInter){ 
   
        this.num=num;
        this.clientInter=clientInter;
    }
    public void call(){ 
   
        clientInter.back();
    }
}

结果:

服务器还在处理,先返回调用是否成功的状态:true
服务器开始处理!!!需要5s
6
server3的num:6
服务器处理完了,回到客户端了
客户端如果num是11,那么回调成功:11
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105935.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue进阶(十八):router.beforeEach 与 router.afterEach 钩子函数

    Vue进阶(十八):router.beforeEach 与 router.afterEach 钩子函数在路由跳转的时候,我们需要一些权限判断或者其他操作。这个时候就需要使用路由的钩子函数。定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数。总体来讲vue里面提供了三大类钩子,两种函数1、全局钩子2、某个路由的钩子3、组件内钩子两种函数:1、Vue.beforeEach(function(to,form,next){})/*在跳转之前执行*/2.Vue.after…

    2022年6月25日
    53
  • wing是什么_数独算法代码

    wing是什么_数独算法代码原题链接设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。输入格式第一行为一个整数N,表示 N×N 的方格图。接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。行和列编号从

    2022年8月9日
    6
  • 执行top命令(linux命令详解之df命令)

    首先介绍top中一些字段的含义:VIRT:virtualmemoryusage虚拟内存1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量RES:residentmemoryusage常驻内存1、进程当前使用的内存大小,但不包括swapout2、包含其他进程的共享3、如果申请100…

    2022年4月11日
    121
  • DEDECMS系统安全篇之移data目录到Web根目录以外听语音

    DEDECMS系统安全篇之移data目录到Web根目录以外听语音

    2021年9月25日
    50
  • Struts2运行错误:Error filterStart

    Struts2运行错误:Error filterStart困扰我近10多天的问题,让我在框架功力修炼上几乎停滞不前,今天问题被KO,小小的高兴下。 纯洁的web.xml文件struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*

    2022年7月11日
    12
  • pycharm安装anaconda虚拟环境_简单编译器

    pycharm安装anaconda虚拟环境_简单编译器Anaconda虚拟环境和Pycharm选择编译器教程

    2022年8月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号