回调函数的理解

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

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

把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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卷积神经网络的网络结构_典型卷积神经网络结构

    卷积神经网络的网络结构_典型卷积神经网络结构GoogLeNet原文地址:GoingDeeperwithConvolutions:https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdfGoogLeNet在2014年由ChristianSzegedy提出,它是一种全新的深度学习结构。GoogLeNet网络的主要创新点在于:提出Inception结构在多个尺寸上同时进行卷积再聚合;

    2022年8月14日
    8
  • Pycharm设置点击无反应解决办法+Pycharm汉化「建议收藏」

    Pycharm设置点击无反应解决办法+Pycharm汉化「建议收藏」Pycharm汉化后会遇到设置点击无反应的情况。解决办法:1,如果你的lib文件下有汉化包“resources_ch.jar”直接删除就可以了。不过汉化就没了。2,删除原来的汉化包,更换汉化包。把“resources_zh_CN_PyCharm_2019.1_r1.jar”复制到lib文件夹下,记着不需要重命名。附亲测有效的汉化包:链接:https://pan.baidu.c…

    2022年5月20日
    99
  • linux centos 权限审核 polkitd进程 简介[通俗易懂]

    linux centos 权限审核 polkitd进程 简介[通俗易懂]polkit是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。Polkit在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和sudo等程序不同,Polkit并没有赋予进程完全的root权限,而是通过一个集中的策略系统进行更精细的授权。Polkit定义出一系列操作,例如运行GParted,并将用户按照群组或用户名进行划分,例如wheel群组用户。了.

    2022年6月15日
    97
  • 破解路由器管理登录密码「建议收藏」

    破解路由器管理登录密码(Linux内核)准备工具:puttytel登录软件正式开工:第一步:首先检查自己的路由器的系统,看是不是Linux内核的,只有是Linux内核的路由器才适合本教程,常见基于Linux内核的路由器系统有Openwrt和DDR-wrt等系统。查看方法一:首先用网线连接要破解管理密码的路由器(LAN口),然后输入登录地址192.168.1.1(一般是这个):可以看到,这个路…

    2022年4月9日
    794
  • Eureka集群环境搭建

    Eureka集群环境搭建前言:Eureka已经停止更新了,在新的项目中,不推荐使用,通过对周阳老师视频的学习,本篇文章主要是简单介绍下Eureka,以及如何搭建集群环境的Eureka,让大家对Eureka有个初步的了解。1.什么是EurekaEureka是Netflix开发的,一个基于REST服务的,服务注册与发现的组件,以实现中间层服务器的负载平衡和故障转移。它主要包括两个组件:EurekaServer和EurekaClientEurekaClient:一个Java

    2022年6月1日
    43
  • 深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客户端)「建议收藏」

    深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客户端)「建议收藏」Redis数据库采用I/O多路复用技术实现文件事件处理器,服务器采用单线程单进程的方式来处理多个客户端发送过来的命令请求,它同时与多个客户端建立网络通信。服务器会为与它相连接的客户端创建相应的redis.h/redisClient结构,在这个结构中保存了当前客户端的相关属性及执行相关功能时的数据结构。I/O多路复用:linux有五类io模型1.阻塞2.非阻塞3…

    2022年6月10日
    28

发表回复

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

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