java回调机制

目录

  • 一、简介
  • 二、示例
    • 2.1 同步回调
    • 2.2 异步回调
    • 2.3 二者区别
  • 三、应用场景


一、简介

在Java中,回调是一种常见的编程模式,它允许一个对象将某个方法作为参数传递给另一个对象,以便在适当的时候调用该方法。

以类A调用类B方法为例:
在类A中方法a调用了类B中的b方法,b方法在执行完成之后,会执行类A中的callback()方法,这个callback方法就是回调函数,表明类B的b方法执行完成。
在这里插入图片描述


二、示例

回调可以分为同步回调和异步回调两种类型。

2.1 同步回调

1.classB实现回调接口重写回调方法
2.classA的工作方法参数含有回调接口
3.classB持有classA,work方法内执行了classA的工作方法,且参数为自己。
即classB.work—>classA.work—>classB.call

Callable

public interface Callable {/*** 回调函数*/public void call();
}

classA

public class classA {public void work(Callable callable){System.out.println("classA:收到classB的通知, 我要开始工作了");try {//模拟classA执行任务Thread.sleep(5000);} catch (Exception e) {e.printStackTrace();}System.out.println("classA:我自己的工作完成了,通知一下classB,调用一下它的call方法");callable.call();//到了打电话给妈妈}}

classB

public class classB implements Callable {//定义类classB实现了Callable接口,实现了call()回调函数的具体内容classA A;public classB(classA A) {this.A = A;}public void work() {System.out.println("classB:我要开始工作了 顺便通知一下classA 开始工作");A.work(this);System.out.println("classB:classA已经完成工作了");}@Overridepublic void call() {System.out.println("classB:执行了自己的call 方法");}}

Test 测试一下

public class Test {public static void main(String[] args) {classA A = new classA();classB B = new classB(A);B.work();}
}

在这里插入图片描述

2.2 异步回调

异步调用发生在某些业务十分耗时,又需要立即返回结果,这个时候需要开辟新的线程处理耗时业务,业务处理完了,再去回调回调函数,处理其他业务。

区别是classB中的work函数实现不同,开启了线程处理函数。不会阻塞最后的通知

    public void work() {System.out.println("classB:我要开始工作了 顺便通知一下classA 开始工作");new Thread(new Runnable() {@Overridepublic void run() {A.work(classB.this);}}).start();System.out.println("classB:classA已经完成工作了");}

在这里插入图片描述

2.3 二者区别

  • 同步回调
    同步回调是指回调方法会在调用者的线程中立即执行,即回调方法和调用方法在同一个线程中执行。
    调用者需要等待回调方法执行完成后才能继续执行后续操作。
    适用于处理简单、快速的操作,不会阻塞调用者线程。
  • 异步回调
    异步回调是指回调方法会在另一个线程中执行,不会阻塞调用者的线程。
    调用者不需要等待回调方法执行完成,可以继续执行后续操作。
    适用于处理耗时操作,避免阻塞调用者线程,提高系统的并发性能和响应速度。

在实际应用中,选择使用同步回调还是异步回调取决于具体的场景和需求。如果操作简单且速度快,可以选择同步回调;如果操作耗时且需要避免阻塞调用者线程,可以选择异步回调。

三、应用场景

回调常用于处理事件结果,例如 A不仅仅执行B中的方法,而且还要监听B中此方法执行的结果,再根据结果状况执行A本身的方法。这种方式可以实现A与B之间的解耦,使得A能够监听并处理B方法执行的结果,从而实现更灵活的控制流程。

参考链接:
JAVA回调机制(CallBack)详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KMP + Compose 跨平台 Android IOS 实战入门

KMP(Kotlin Multiplatform)是一种面向移动端开发的跨平台框架,使用 Kotlin 语言编写,可实现在 Android 和 iOS 平台上共享代码和逻辑。通过 KMP 框架,我们可以编写一次代码,然后在不同的平台上进行部署和运…

python能够干什么?

python有哪些用途? Python是一种高级编程语言,它被广泛用于各种不同的领域。以下是Python的一些常见用途: 网络应用开发:Python可以用于编写Web应用程序、API、爬虫、网络服务器等。数据科学和机器学习:Python拥有许…

深究muduo网络库的Buffer类!!!

最近在学习了muduo库的Buffer类,因为这个编程思想,今后在各个需要缓冲区的项目编程中都可以用到,所以今天来总结一下! Buffer的数据结构 muduo的Buffer的定义如下,其内部是 一个 std::vector,且还存在两个…

Shell编程之条件语句

条件测试 文件测试与整数测试 字符串测试与逻辑测试 if语句 if单分支语句 if双分支语句 if多分支语句 case分支语句 条件测试操作 条件测试操作 1 条件判断 test命令测试表达式是否成立,若成立返回0.否则返回其它数值。 格式 1 test 条件表达式 格式 2 …

【Redis7】了解Redis

1.常见数据库 1.1.键值存储数据库 如 Map 一样的key-value 对,典型代表就是 Redis。 1.2.列存储数据库 关系型数据库是典型的行存储数据库,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。而按列存储则可实现分布式存储&…

猫不爱喝水是正常的?求求別再被洗脑了!日常可以补水的主食分享

猫不爱喝水正常吗?看给猫喂的什么,喂的罐头的话不爱喝水问题不大。喂的干粮猫还长期不喝水,处于缺水状态,可能会出现便秘、上火、尿黄、尿少等症状。在高温的夏季,猫还可能因脱水而中暑,严重时甚至可能导致…

用c++实现汉诺塔问题、归并排序

6.1.3 汉诺塔问题 【问题】 汉诺塔问题(Hanio tower problem)来自一个古老的传说:有一座宝塔(塔A),其上有64个金碟,所有碟子按从大到小由塔底堆放至塔顶。紧挨着这座宝塔有另外两座宝塔(塔B和塔C),要求把塔A上的碟子移动到塔C上…

01-xss基本原理

核心:攻击的是前端&#xff0c; 一、课程引入 1、开发一个简单的PHP页面&#xff0c;代码如下&#xff1a; <?php // xss 基础演示代码&#xff1a;从浏览器中接受一个URL地址参数名为content if(isset($_GET[content])){$content$_GET[content];echo "你输入的内容…

再议大模型微调之Zero策略

1. 引言 尽管关于使用Deepspeed的Zero策略的博客已经满天飞了&#xff0c;特别是有许多经典的结论都已经阐述了&#xff0c;今天仍然被问到说&#xff0c;如果我只有4块40G的A100&#xff0c;能否进行全量的7B的大模型微调呢&#xff1f; 正所谓“纸上得来终觉浅&#xff0c;…

进程状态与优先级

Linux内核源代码&#xff1a; 首先我们需要明确一点&#xff0c;Linux操作系统和操作系统的进程状态是不同的 上图大概标识了各个状态对应在操作系统的状态 普通进程 R运行状态&#xff08;running&#xff09;: 并不意味着进程一定在运行中&#xff0c;它表明进程要么是在…

ROS 2边学边练(44)-- 从头开始构建一个视觉机器人模型

前言 从此篇开始我们就开始接触URDF(Unified Robot Description Format&#xff0c;统一机器人描述格式)&#xff0c;并利用其语法格式搭建我们自己的机器人模型。 动动手 开始之前我们需要确认是否安装joint_state_publisher功能包&#xff0c;如果有安装过二进制版本的urdf_…

解密某游戏的数据加密

前言 最近有个兄弟通过我的视频号加我&#xff0c;咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注&#xff0c;于是通过抓包工具测试了下&#xff0c;发现数据有时候是明文&#xff0c;有时候确实密文&#xff0c;大致看了下有这几种加密&#xff1a;Md5aes、Md5&a…

网络层协议之 IP 协议

IP 协议格式 4 位版本&#xff1a;此处的取值只有两个&#xff0c;4&#xff08;IPv4&#xff09;和 6&#xff08;IPv6&#xff09;&#xff0c;即指定 IP 协议的版本。 4 位首部长度&#xff1a;描述了 IP 报头多长&#xff0c;IP 报头是变长的&#xff0c;因为报头中的选项部…

点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp

餐饮连锁v2版-体验后台&#xff08;复制粘贴以下地址到浏览器&#xff0c;打开网址即可登录&#xff0c;) 本文来自&#xff1a;点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp - 源码1688 演示后台&#xff1a;https://diancan.…

异构图神经网络——Heterogeneous Graph Neural Networks

相关代码见文末 1.回顾同构图 1.1 GNN GNN基本计算方法——邻接矩阵乘以节点,聚合相邻节点的特征,得到本节点的特征表达 1.2 Graph Attention Network 引入图注意力,实现边的权重可学习,最简单的方法是,将两个节点的特征进行拼接,使用一组可学习的权重参数映射为边的权…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

学习大数据,所需更要的shell基础(2)

文章目录 read读取控制台输入函数系统函数bashnamedirname 自定义函数Shell工具&#xff08;重点&#xff09;cutawk 正则表达式入门常规匹配常用特殊字符 read读取控制台输入 1&#xff09;基本语法 read (选项) (参数) ①选项&#xff1a; -p&#xff1a;指定读取值时的提示…

C++初识多态(1)

1.多态要解决的问题&#xff08;引入&#xff09; 任何一种机制的存在&#xff0c;必然是有其存在的意义的&#xff0c;例如我们前面学过的函数重载&#xff0c;运算符重载&#xff0c;以及引用等等&#xff0c;都是解决一些特殊问题的&#xff1b; 下面通过一些具体的例子&a…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…

剁手党必看——转转红包使用规则与最优组合计算全解析

​ 1、省钱攻略基础之“了解平台红包使用规则” 2、举个栗子 3、最优红包组合计算方法进化过程 3.1、初代“笛卡尔乘积”版 3.2、二代“边算边比较Map聚合”版 3.3、三代“边算边比较数组索引定位”版 4、总结 1、省钱攻略基础之“了解平台红包使用规则” 规则一&#x…