Java-回调函数

article/2025/10/5 16:54:17

在这里插入图片描述

什么是回调

函数调用可以分为三种模式,串行调用、异步调用、回调。这三种都是日常开发中常见到的方式。

一个方法执行完,再执行下一个,串行逻辑会阻塞线程执行流程,等到所有逻辑执行结束,线程才会结束。

异步执行是非阻塞类型。在主线程中,可以通过new Thread的方式异步执行逻辑,通过Thread执行的逻辑不会阻塞主流程。类似日志上报,发送kafka消息等,都可以通过异步的方式处理。

回调,就是客户程序A调用服务程序B中的一个函数F_B,然后B又在某个时候反过来调用A中的某个函数F_A,对于A来说,这个F_A便叫做回调函数。一般说来,A不会自己调用F_A,A提供F_A的目的就是让B来调用它。由于B并不知道A提供的F_A姓甚名谁,所以A会约定F_A的接口规范,然后由A提前通过B的一个函数R告诉B自己将要使用F_A函数,这个过程称为回调函数的注册,R称为注册函数。

下面举个通俗的例子: 某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,于是我们约定:等你想出办法后打手机通知我 。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。

例子中加粗的两部分说明这是一个“异步+回调“的过程,异步便是我给你打完电话,没有等你相处结果,回调是你在想到办法之后通知我。这里我的手机号就相当提前在你这注册的回调函数,你处理完成之后,直接调用函数来通知我。

通过在工作中的场景,自认为回调和异步更搭配。另外就是写框架性的代码,回调用的会多一些。

java中回调的应用

可以想象一个场景,有数据库需要回填某些数据,数据回填之后要将数据修改数量,结束时间等进行记录。

这个场景是不是和例子比较像,都是主线程下发一个任务,子线程完成任务之后,通知主线程执行其他操作。可以看下代码

首先定义一个回调接口

//接口可以接收多个入参,有一个出餐
public interface FuncCallback<P, R> {R call(P... p);
}

然后定义数据处理类,这个类的入参除了数据处理中需要的参数外,还需要有回调类

public class DbDataFresh {/*** 数据处理执行逻辑,dataType,operator为业务逻辑需要的参数* FuncCallback callback 是绑定的回调接口。这样绑定之后,* 任意一个调用DbDataFresh.fresh的程序,都可以指定逻辑处理结束之后的回调* 在fresh方法中可以指定通过修改callback.call调用顺序,控制回调时机*/public void fresh(Integer dataType, String operator, FuncCallback callback) {//do fresh, get data change countint total = 100;//callback callcallback.call(total, System.currentTimeMillis());}
}

我们再看一下程序的主入口

public class UserHandleMain {private static final DbDataFresh dbDataFresh = new DbDataFresh();public static void main(String[] args) {//调用DbDataFresh.fresh方法,同时绑定回调//回调函数使用fresh方法传回来的数据进行其他逻辑处理dbDataFresh.fresh(1, "system", new FuncCallback() {@Overridepublic Object call(Object[] p) {if (p == null || p.length == 0) {return "handle empty";}//遍历处理结果StringBuilder res = new StringBuilder();for (Object o : p) {res.append(o.toString()).append("_");}System.out.println(res.toString());return res.toString();}});//使用lambda方式,这种貌似是比较常见到的dbDataFresh.fresh(1, "system", p -> {if (p == null || p.length == 0) {return "handle empty";}//遍历处理结果StringBuilder res = new StringBuilder();for (Object o : p) {res.append(o.toString()).append("_");}System.out.println(res.toString());return res.toString();});}
}

参考

Java-接口回调-掘金
Java接口回调-csdn


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

相关文章

java回调函数(callBack)

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

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

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

Java回调函数理解和应用

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

java回调函数(全干货)

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

深入理解Java回调函数

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

java 回调函数解读

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

java中的回调函数

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

Java回调函数详解

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

numpy 数据类型转换

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

javascript学习之数据类型转换

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

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

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;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…