java回调函数(callBack)

article/2025/10/5 16:41:50

       最近有个新同事给我写了个接口,说是用到了回调,我等了半天发现结果才返回回来,把我都整急了。最后我看了他的代码,目瞪口呆。他还信誓旦旦的说没错,按网上的例子来写的。

       我一搜,网上例子真一大堆,并且都尼玛差不多。

首先,定义写的不错:经理A下班前打电话给程序猿B,叫他加班搞定一个项目,然后经理A就挂了电话,程序猿B加班搞定了整个项目,并打电话告诉了经理A。程序猿B将结果告诉经理A的这个行为就是回调。

      网上有句话叫做什么?应聘造就面试人才!!!这句话真的没错。。。先来看他们的demo(大致如下面写的):

ClassA.java(表示经理A)
package com.example.demo1.dto;public class ClassA {public static void sendCommand(String command){ClassB.acceptCommand(command);}public static void callBack(String str){System.out.print(str);}
}

ClassB.java(表示程序猿B)

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");doSomething(command);ClassA.callBack("命令【"+command+"】执行完毕!\n");}public static void doSomething(String command){System.out.print("正在执行命令:"+command+"\n");}
}

执行结果:

然后再接着还进行了一些抽象封装。

看到上面,我要是经理A,我肯定让你将代码提交一下,然后告诉你不用来上班了!我是卸磨杀驴吗?不是,是你技术太渣!

       为什么这么说呢?明明下了命令后我是是可以约妹子去聊聊人生,聊聊理想的。结果呢,丫的,下了命令,却不能挂电话,还得听你在那啰里吧嗦的,直到你说搞好了。。。

      怎么是这样呢?明明用了回调函数呀!但你有没有发现,你这回调函数用的,跟直接return 没有区别,也就是ClassA.callBack("命令【"+command+"】执行完毕!\n");跟直接 return "命令【"+command+"】执行完毕!\n";的效果一样!!

        我将定义抽象一下,A向B发送请求,B由于执行时间比较长,无法立刻知道结果,就只是告诉A收到你的请求了,然后埋头干活,干完后,再通知A最终的结果。

       这个例子写得是像模像样的,但关键是没整明白,回调主要是用在异步上面,像这样用在同步上面,就没什么意义了。

那该如何改了,很简单,将ClassB.java改一下就好了,更改后代码如下:

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");new Thread(new Runnable() {@Overridepublic void run() {System.out.print("正在执行命令:"+command+"\n");ClassA.callBack("命令【"+command+"】执行完毕!\n");}}).start();ClassA.callBack("收到命令【"+command+"】了,马上开始执行!\n");}
}

执行结果如下:

通过这个,效果就达到了。经理A下班前打电话给程序猿B,叫他加班搞定一个项目,程序猿B说:“收到,马上开干!”,然后经理A挂了电话就约妹去了。然后程序猿B干完了之后,给经理A回了一个电话:"搞定了!"。经理A一想,小伙子靠谱啊,看来得给你加薪了,免得被人挖走了。

 

至于抽象封装就自己搞定哈。

 

       在同一个服务中,上面的回掉是没有任何问题的,但如果是跨系统跨服务,那么该怎么实现回掉呢,毕竟你的class和方法别人是无法拿的到的。这时候,一般可以采用消息推送。IM即时通信系统,推送是很简单的,其他系统,也可以采用消息中间件MQ进行结果的推送,当然,最简单的是增加一个参数,让A请求的时候带上回掉的URL,然后B处理完后,通过Httpclient调用该URL将结果通知A。像微信公众号的模板消息,群发消息结果的通知就是这么干的。

      总之,回调是一种思想,不要拘泥于形式。


http://chatgpt.dhexx.cn/article/pDs0Ks3K.shtml

相关文章

java回调函数的作用以及运用

模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的调用模式,也就是说,被调用的…

Java回调函数理解和应用

#Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的。 在未理解之前,我也是一脸懵逼,等我理解之后&…

java回调函数(全干货)

产生接口回调的场景 产生接口回调的场景很简单,比如A叫B帮忙做一件事,交代完后A去忙别的事,然后B做完这件事之后会通知A, 通知A的这个动作就是接口回调的动作。接口回调 接口回调的意义是通过接口来实现解耦的的前提下调用另一个类的方法,也就是B为A准…

深入理解Java回调函数

废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他…

java 回调函数解读

模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b()&…

java中的回调函数

CALLBACK,即回调函数,是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接…

Java回调函数详解

什么是回调函数(CallBack) 在编写程序时,有时候会调用许多API中实现实现的函数,但某些方法需要我们传入一个方法,以便在需要的时候调用我们传入进去的函数。这个被传入的函数称为回调函数(Callback functi…

numpy 数据类型转换

参考NumPy 数据类型 - 云社区 - 腾讯云 首先需要导入numpy模块 import numpy as np 首先生成一个浮点数组 a np.random.random(4) dtype的用法 看看结果信息,左侧是结果信息,右侧是对应的python语句 我们发现这个数组的type是float64,…

javascript学习之数据类型转换

⭐️⭐️⭐️ 作者:船长在船上 🚩🚩🚩 主页:来访地址船长在船上的博客 🔨🔨🔨 简介:资深前端开发工程师,专注前端开发,欢迎咨询交流&#xff0…

【Python入门篇】——Python基础语法(数据类型与数据类型转换)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

Java八种基本数据类型转换

转换规则&#xff1a; 1、八种基本数据类型当中除布尔类型之外剩下的7种类型之间都可以相互转换。 2、小容量向大容量转换&#xff0c;称为自动类型转换&#xff0c;容量从小到大排序(此处没有布尔类型)&#xff1a; byte < short < int < long < float < doub…

Java数据类型转换

前言 我将在这篇文章中介绍关于Java数据类型转换的知识 一、Java基本数据类型的转换 Java的数据类型转换分两种&#xff0c;一种是由低精度向高精度转换&#xff0c;另一种是由高精度由低精度转换 double float long int short byte 以上数据类型的精度由高到低 1.由低精度向…

C#中的数据类型转换

一、定义 C# 是一门强类型语言&#xff0c;对类型要求比较严格&#xff0c;但是在一定的条件下也是可以相互转换的&#xff0c; 如将 int 型数据转换成 double 型数据。 C#中的数据类型转换分为两种&#xff1a;隐式类型转换以及显式类型转换&#xff1b; 二、数据类型转换方式…

Pandas数据类型转换

Pandas数据类型转换 一、Pandas中的数据类型&#xff1a; 不管是Series还是DataFrame的每一列&#xff0c;都有对应的数据类型。在Pandas中存在以下数据类型。 Pandas dtypePython 类型Numpy类型描述objectstr或者mixed&#xff08;混合类型&#xff09;string_, unicode_, …

C++ 数据类型转换

C 数据类型转换 概述不同类型数据间的转换隐式类型转换强制类型转换自己声明的类型转换转换构造函数 类型转换函数案例应用 概述 在日常的开发中, 我们经常会用到数据类型转换, 所以我们要对数据类型转换有一定的了解. 不同类型数据间的转换 在 C 中, 某些标准类型的数据之间…

C语言数据类型转换详解

数据类型转换就是将数据&#xff08;变量、数值、表达式的结果等&#xff09;从一种类型转换为另一种类型。 自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换&#xff0c;这种转换不需要程序员干预&#xff0c;会自动发生。 1 . 将一种类型的…

Java的数据类型转换

Java的数据类型转换分为以下的两种&#xff1a; 一、自动类型转换 首先我们要了解自动类型转换是什么&#xff0c;为什么要进行自动类型转换呢&#xff1f; 1.自动类型转换就是类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。比如以下代码&#xff1a; 其中int类…

Python 中数据类型转换

前两篇回顾&#xff1a; 第一篇&#xff1a;环境搭建以及运行 Python 的 3 种方式 第二篇&#xff1a;变量及数据类型 今天是 Python 基础系列第三篇&#xff1a;三种数据类型转换形式&#xff08;布尔值转换、字符串转换、数值转换&#xff09;。 一、转为布尔值 一&#xf…

C语言数据类型转换

文章目录 前言一、类型自动转换二、赋值转换三、强制类型转换 前言 C语言中&#xff0c;整型、单精度型、双精度型和字符型数据可以进行混合运算。字符型数据可以得与整型通用。例如&#xff1a; 100′A′8. . 65-2456. 75′a′是一个合法的运算表达式。在进行运算时&#xf…

数据类型的转换

数据类型转换分为两种&#xff1a;自动类型转换和强制类型转换。 一、自动类型转换 ①转换前的数据类型与转换后的类型兼容。 ②转换后的数据类型的表示范围比转换前的类型大。 条件②说明不同类型的数据进行运算时&#xff0c;需先转换为同一类型&#xff0c;然后进行运算。…