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.hqwc.cn/news/679202.html

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

相关文章

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学 暗区突围是一款极为惊险的射击游戏,让玩家充分感受紧张激烈的战斗以及获取财富的过程。但是有许多新手玩家是不会在游戏里赚钱的,也会在赚钱过程中遇到很多问题,我将在这篇文章…

百度云内容审核快速配置 (java)

为什么要选择百度云 ? 因为他免费用一年 首先要先开通百度云内容安全服务 按照操作指引走完整套 ContentCensor Java SDK目录结构** com.baidu.aip├── auth //签名相关类├── http //Http通…

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言,正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展,如何将BACnet设备无缝融入云端生态系统,成为众多楼宇管理者关注的焦点。本文将以一个实际案例,揭示BACnet网…

DJANGO_PART 1

DJANGO_PART 1 文章目录 DJANGO_PART 11. 安装DJANGO2. 创建项目3. APP概念4. 快速上手5. templates6. 引入其它静态文件7. 模板语法8. 请求与响应 1. 安装DJANGO 安装语句:pip install django 2. 创建项目 django中项目会有一些默认的文件和默认的文件夹 终端创建…

在ubuntu虚拟机中手动安装VMware Tools(VMware Workstation 17 player)

可参考官方文档:在 Linux 虚拟机中手动安装 VMware Tools 以下列出我在安装过程中遇见的问题: 1、“安装VMware Tools”选项为灰,无法选中 原因是VMware Tools的安装包镜像在Player的安装目录下,需要在虚拟机启动的时候加载这个…

【Linux】常用基本指令

目录 食用说明 用户管理 whoami/who clear tree 目录结构和路径 pwd ls 文件 隐藏文件 常用选项 cd 家目录、根目录、绝对路径和相对路径 touch 常用选项 mkdir rmdir/rm man cp mv cat nano echo 输出重定向 > 输入重定向 < more/less head/…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

第18讲:Ceph集群CrushMap的核心概念、默认规则与完整定义

文章目录 1.CrushMap核心概念2.集群默认的CrushMap规则剖析2.1.CrushMap列表显示内容剖析2.2.对默认的CrushMap规则进行深度的剖析2.3.完整的CrushMap定义信息 1.CrushMap核心概念 CrushMap官方文档&#xff1a;https://docs.ceph.com/en/pacific/rados/operations/crush-map/…

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff08;双向Transformer 的预训练&#xff09; 核心技术&#xff1a; Embedding 、Attention --> Transformer 任务简介、拟解决问题…

led显示屏用什么胶水封装比较好?

led显示屏用什么胶水封装比较好&#xff1f; LED显示屏通常使用特定的胶水进行封装&#xff0c;以确保其稳定性和耐用性。常见的用于LED显示屏封装的胶水类型包括有机硅灌封胶、环氧树脂灌封胶等。 有机硅灌封胶具有优异的耐高温、防水、绝缘和密封性能&#xff0c;非常适合用…

vue3+vite+js 安装

首先需要node版本高于V16.14.1&#xff0c;我用的node版本 V20.12.0 目前使用的是vue3vitejs&#xff0c;没有使用ts 安装 执行 npm create vitelatest 具体选择按照自己实际需要的来 Project name:项目名称 Select a framework:选择用哪种框架 &#xff08;我选择vue&#…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日&#xff0c;备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天&#xff0c;真的攒足了眼球&#xff0c;不仅俄罗斯这边的很多媒体和自媒体有报道&#xff0c;展会第一天&#xff0c;很多参展商通过短视频平台将展会的盛况传到了国内&#…