回调函数:同步回调和异步回调

server/2024/9/24 21:22:48/

回调函数:同步回调和异步回调


一、什么是回调函数

回调函数(Callback Function)是一种通过函数指针传递的函数,允许程序在某个事件或条件发生时,调用预定义的函数。简言之,回调函数是在某个操作完成后自动执行的函数回调函数通常用于异步编程、事件驱动编程和处理回调事件

回调函数的主要特点

  1. 函数作为参数传递:回调函数是作为参数传递给其他函数的。
  2. 事件驱动:在某个事件或条件满足时,程序会调用回调函数
  3. 异步处理:在异步编程中,回调函数允许程序在等待某个操作完成时继续执行其他任务。

二、异步回调函数和同步回调函数有何区别?

同步回调函数

同步回调函数是指在执行回调函数之前,任务必须完全完成。也就是说,回调函数的调用是在任务完成后立即发生的。

特点

  1. 阻塞执行:主线程会等待任务完成后再继续执行回调函数。执行流程是顺序的。
  2. 简单的执行模型:任务的执行和回调函数的调用是线性的。代码的执行顺序与逻辑顺序一致。

常见场景

适用于那些任务执行时间短且不需要等待其他事件或操作的情况。例如,简单的数据处理、计算等。

javascript">// 同步任务类
public class SyncTask {private Callback callback;// 构造函数接受回调接口public SyncTask(Callback callback) {this.callback = callback;}// 执行同步任务public void execute() {System.out.println("开始同步任务...");// 模拟任务执行String result = "任务完成结果";// 任务完成,调用回调函数callback.onComplete(result);}
}// 回调接口
public interface Callback {void onComplete(String result);
}// 主类
public class Main {public static void main(String[] args) {// 实现回调接口Callback callback = new Callback() {@Overridepublic void onComplete(String result) {System.out.println("任务完成,结果是: " + result);}};// 创建并执行同步任务SyncTask syncTask = new SyncTask(callback);syncTask.execute();}
}

异步回调函数

异步回调函数是指任务的执行和回调函数的调用是分开的。任务可以在后台线程中异步执行,而回调函数会在任务完成后异步调用。

特点

  1. 非阻塞执行:主线程可以继续执行其他操作,不会因为等待任务完成而阻塞。任务和回调函数的执行是异步的。
  2. 复杂的执行模型:由于任务和回调函数的执行在不同的线程或时间点,代码逻辑可能更复杂,需要处理线程同步或数据一致性问题。

常见场景

适用于需要等待 I/O 操作(如网络请求、文件读取)、长时间计算等任务的情况。可以提升程序的响应性和用户体验。

javascript">// 异步任务类
public class AsyncTask {private Callback callback;// 构造函数接受回调接口public AsyncTask(Callback callback) {this.callback = callback;}// 执行异步任务public void execute() {System.out.println("开始异步任务...");new Thread(() -> {try {// 模拟耗时操作Thread.sleep(2000); // 假设任务需要 2 秒完成} catch (InterruptedException e) {e.printStackTrace();}// 任务完成,调用回调函数callback.onComplete("任务数据");}).start();}
}// 回调接口
public interface Callback {void onComplete(String result);
}// 主类
public class Main {public static void main(String[] args) {// 实现回调接口Callback callback = new Callback() {@Overridepublic void onComplete(String result) {System.out.println("任务完成,结果是: " + result);}};// 创建并执行异步任务AsyncTask asyncTask = new AsyncTask(callback);asyncTask.execute();// 主线程继续执行其他操作System.out.println("主线程继续执行其他操作...");}
}

三、对比总结

同步回调函数

  1. 主线程等待任务完成后再调用回调函数
  2. 执行流程顺序一致,简单直观。
  3. 适合短时间任务,容易理解和实现。

异步回调函数

  1. 主线程继续执行,不会因为等待任务完成而阻塞。
  2. 任务在后台线程中执行,回调函数在任务完成后异步调用。
  3. 适合长时间任务,提升程序响应性,但需要处理线程安全等复杂问题。

http://www.ppmy.cn/server/114954.html

相关文章

【Python】Python 读取Excel、DataFrame对比并选出差异数据,重新写入Excel

背景:我在2个系统下载出了两个Excel,现在通过对下载的2个Excel数据,并选出差异数据 从新写入一个新的Excel中 differences_url rC:\Users\LENOVO\Downloads\differences.xlsx; //要生成的差异Excel的位置及名称 df1_url rC:\Users\LENOVO\Dow…

Java SpringBoot集成Vue.js,构建茶园茶农文化交流平台,四步实现高效互动,MySQL存储数据更稳定

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

NLP基础及其代码-tokenizer

基础知识 NLP-分词器:SentencePiece【参考Chinese-LLaMA-Alpaca在通用中文语料上训练的20K中文词表并与原版LLaMA模型的32K词表进行合并的代码】_sentencepiece 中文训练-CSDN博客 【OpenLLM 008】大模型基础组件之分词器-万字长文全面解读LLM中的分词算法与分词器…

LabVIEW中Request Deallocation 功能

此功能会在包含该功能的 VI 运行之后释放未使用的内存。 该功能仅适用于高级性能优化。在某些情况下,释放未使用的内存可以提高性能。然而,过于频繁地释放内存可能导致 LabVIEW 反复重新分配空间,而不是重用已有的内存分配。如果您的 VI 分配…

sql92语句与sql99语法的区别

场景:测试sql92语句与sql99语法的区别 –创建测试表 CREATE table ypg_08161 as select ‘1’ as id ,‘one’ as c_name union all select ‘2’ as id ,‘two’ as c_name CREATE table ypg_08162 as select ‘1’ as id ,‘male’ as c_sex union all select ‘3’ as id …

Linux命令:把大文件分割成较小的文件的命令行工具split详细介绍

目录 一、概述 二、用法 1、基本语法 2、参数详解 3、常用选项 4、获得帮助 三、应用场景 1. 备份文件 2. 传输文件 3. 压缩和归档 4. 处理日志文件 5. 分片上传和下载 6. 创建测试数据 7. 分析大数据集 8. 创建数据库备份 四、 示例 1、按行数分割文件 2、 …

k8s 部署 ruoyi 前后端分离项目

本文视频版: https://www.bilibili.com/video/BV17ugkePEeN 参考 https://blog.csdn.net/qq_50247813/article/details/136934090 https://gitee.com/nasaa/RuoYi-Vue-cloud https://www.itsgeekhead.com/tuts/kubernetes-129-ubuntu-22-04-3/ https://kubernetes.io/docs…

信息安全工程师(3)TCP/IP协议簇

前言 TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式。它不仅仅指的是TCP和IP两个协议,而是由一系列协议组成的协议簇,这些协议共同支持着互联网上的数据传输和通信。以下是对TCP/IP协议簇的详细概述: 一、组成 TCP/IP协…