实现异步的8种方式

一、前言

在编程中,有时候我们需要处理一些费时的操作,比如网络请求、文件读写、数据库操作等等,这些操作会阻塞线程,等待结果返回。为了避免阻塞线程、提高程序的并发处理能力,我们常常采用异步编程。

异步编程是一种编程方式,它通过将任务提交给其他线程或者线程池来实现并发处理,从而提高程序的性能和响应速度。

本文将介绍异步的八种实现方式,并详细阐述异步编程的概念、实现方式和优缺点等问题。

二、异步的八种实现方式

异步编程的实现方式有很多种,下面是常见的八种实现方式:

  1. 线程异步
  2. Future异步
  3. CompletableFuture实现异步
  4. Spring的@Async异步
  5. Spring ApplicationEvent事件实现异步
  6. 消息队列
  7. ThreadUtil异步工具类
  8. Guava异步

不同的实现方式适用于不同的场景,我们需要根据具体的需求来选择合适的实现方式。

三、什么是异步?

在讲解异步编程之前,我们先来了解一下异步的概念。

异步是指不需要等待当前操作完成,就能够进行其他操作。例如,我们发出一个网络请求后,可以继续执行其他任务,不必等待网络请求返回结果再执行其他任务,这就是异步操作。

异步的本质是将任务提交给其他线程或者线程池来处理,等待结果时,当前线程不会被阻塞,可以继续处理其他任务。

四、异步编程

异步编程是通过将耗时的任务分配给其他线程或者线程池来实现的,可以提高程序的并发处理能力,让程序具有更好的性能和响应速度。

下面我们将介绍异步编程的八种实现方式。

4.1 线程异步

线程异步是一种最为基础的异步实现方式,它通过创建一个新的线程来执行耗时操作,从而避免阻塞主线程。

线程异步的示例代码如下:

public void doAsyncTask() {Thread thread = new Thread(() -> {// 耗时操作doHeavyTask();});thread.start();
}private void doHeavyTask() {// 耗时操作// ...
}

4.2 Future异步

Future异步是通过使用Java的Future接口来实现的,它提供了异步编程的基础能力。

Future异步的示例代码如下:

public void doAsyncTask() {ExecutorService executorService = Executors.newCachedThreadPool();Future<Result> future = executorService.submit(() -> {// 耗时操作return doHeavyTask();});// 在这里处理异步操作的结果try {Result result = future.get();handleResult(result);} catch (Exception e) {handleError(e);}
}private Result doHeavyTask() {// 耗时操作// ...return new Result();
}private void handleResult(Result result) {// 处理异步操作的结果// ...
}private void handleError(Exception e) {// 处理异步操作的异常// ...
}

4.3 CompletableFuture实现异步

CompletableFuture是Java 8中引入的一个异步编程工具类,它提供了更加方便的异步编程方式。

CompletableFuture实现异步的示例代码如下:

public void doAsyncTask() {CompletableFuture<Result> future = CompletableFuture.supplyAsync(() -> {// 耗时操作return doHeavyTask();});// 处理异步操作的结果future.thenAccept(this::handleResult).exceptionally(this::handleError);
}private Result doHeavyTask() {// 耗时操作// ...return new Result();
}private void handleResult(Result result) {// 处理异步操作的结果// ...
}private void handleError(Throwable throwable) {// 处理异步操作的异常// ...
}

4.4 Spring的@Async异步

Spring框架提供了@Async注解来实现异步编程,它可以将一个方法标记为异步执行,并使用ThreadPoolTaskExecutor来执行耗时操作。

Spring的@Async异步的示例代码如下:

@Service
public class MyService {@Asyncpublic void doAsyncTask() {// 耗时操作doHeavyTask();}private void doHeavyTask() {// 耗时操作// ...}
}

4.5 Spring ApplicationEvent事件实现异步

Spring还提供了ApplicationEvent异步事件,可以在事件监听器中处理耗时操作,从而实现异步编程。

Spring ApplicationEvent事件实现异步的示例代码如下:

@Component
public class MyEventListener {@EventListener@Asyncpublic void handleEvent(MyEvent event) {// 耗时操作doHeavyTask();}private void doHeavyTask() {// 耗时操作// ...}
}

4.6 消息队列

消息队列是一种基于异步消息传递的异步编程方式,它将消息放入队列中,异步处理这些消息。

常见的消息队列有ActiveMQ、RabbitMQ、RocketMQ等等。

消息队列的示例代码如下:

public void doAsyncTask() {// 发送异步消息sendAsyncMessage();// 处理其他任务// ...
}private void sendAsyncMessage() {// 将消息发送到消息队列中// ...
}

4.7 ThreadUtil异步工具类

ThreadUtil是一个Java工具类,提供了很多方便的异步编程方法,例如:线程池、定时器、异步调度等等。

ThreadUtil异步工具类的示例代码如下:

public void doAsyncTask() {// 使用线程池执行异步任务ThreadUtil.execAsync(() -> {// 耗时操作doHeavyTask();});// 处理其他任务// ...
}private void doHeavyTask() {// 耗时操作// ...
}

4.8 Guava异步

Guava是一个Google开发的Java工具类库,提供了很多常用的工具类和方法,其中包括异步编程的实现方式。

Guava异步的示例代码如下:

public void doAsyncTask() {ListenableFuture<Result> future = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()).submit(() -> {// 耗时操作return doHeavyTask();});Futures.addCallback(future, new FutureCallback<Result>() {@Overridepublic void onSuccess(@Nullable Result result) {handleResult(result);}@Overridepublic void onFailure(Throwable throwable) {handleError(throwable);}});
}private Result doHeavyTask() {// 耗时操作// ...return new Result();
}private void handleResult(Result result) {// 处理异步操作的结果// ...
}private void handleError(Throwable throwable) {// 处理异步操作的异常// ...
}

以上就是异步编程的八种实现方式,它们各有优缺点,我们需要根据具体的需求来选择合适的实现方式。

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

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

相关文章

2024 IDM最新破解版及软件介绍

*IDM&#xff1a;信息时代的高效管理工具** 在快节奏的现代社会中&#xff0c;随着信息的爆炸式增长&#xff0c;如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM&#xff0c;作为一种信息管理工具&#xff0c;正在逐渐受到人们的青睐。 IDM&#xff0c;全称Inform…

Linux--进程控制(1)

文章衔接&#xff1a; Linux--环境变量-CSDN博客 Linux--地址空间-CSDN博客 目录 1.进程创建 2.进程的终止 2.1想明白&#xff1a;终止是在做什么&#xff1f; 2.2进程终止的三种情况 2.3 进程如何终止 3.进程等待 &#xff08;wait/waitpid&#xff09; 1.进程创建 在li…

C++内存分布 new和delete介绍

目录 C/C内存分布 栈区 堆区 静态区 常量区 C new和delete 分配空间形式对比 new delete与malloc free的区别 可不可以串着使用new和free呢 C/C内存分布 C的内存分布&#xff0c;大体上分为栈区 堆区 静态区 常量区 栈区 栈区是用于存储函数调用时的局部变量 函…

MySQL——运维

日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 查看日志位置&#xff1a; sho…

Eigen::svd和 np.linalg.svd的不同之处

目录 pythonc结论参考 SVD奇异值分解与PCA主成分分析 SVD动画图解–Wiki Eigen Svd 和 np.linalg.svd都可以用于SVD计算&#xff0c;但两者却存在细微的差别。 python import numpy as np datanp.array([[0.99337785, 0.08483806, 0.07747866, -92.91055059],[-0.07889607,…

【Qt常用控件】—— 多元素控件

目录 1.1 List Widget 1.2 Table Widget 1.3 Tree Widget 1.4 小结 Qt 中提供的多元素控件有: QListWidget QListView QTableWidget QTableView QTreeWidget QTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例&#xff1a; QTableView 是基于…

自动驾驶---OpenSpace之Hybrid A*规划算法

1 背景 笔者在上周发布的博客《自动驾驶---低速场景之记忆泊车》中,大体介绍了记忆泊车中的整体方案,其中详细阐述了planning模块的内容,全局规划及局部规划(会车)等内容,包括使用的算法,但是没有深入详细地展开讲述OpenSpace规划算法,因此在本篇博客中,详细讲解该部分…

03-JAVA设计模式-备忘录模式

备忘录模式 什么是备忘录模式 Java中的备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后可以将对象恢复到原先保存的状态…

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …

【AI】Deepstream入门(2)Ubuntu20.04安装Deepstream

1、安装GPU驱动 本人显卡型号:RTX4060 Laptop(笔记本专用显卡) 【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动 2、安装cuda、cuDNN 【AI】Ubuntu20.04安装cuda、cuDNN 3、安装TensorRT 1)下载 下载地址:https://docs.nvidia.com/deeplearning/tensorrt/archives/i…

用于肺结节分类的常规 EHR 的纵向多模态Transformer集成成像和潜在临床特征

Longitudinal Multimodal Transformer Integrating Imaging and Latent Clinical Signatures from Routine EHRs for Pulmonary Nodule Classification 摘要 该研究提出了一种基于Transformer 的多模态策略&#xff0c;用于将重复成像与常规电子健康记录&#xff08;EHRs&…

JS常用数据类型的方法函数调用,数组的方法、对象的方法、字符串的方法、数字的方法、集合的方法、映射的方法、栈的方法、队列的方法、链表的封装、树的封装、

JS常用数据类型的方法函数调用&#xff0c;数组的方法、对象的方法、字符串的方法、数字的方法、集合的方法、映射的方法、栈的方法、队列的方法、链表的封装、树的封装 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是一组按顺序存储的元素的集合&#xff1a;2. 对象…

低空经济概念

低空经济是指利用低空空域资源&#xff0c;通过低空交通工具和技术创新发展&#xff0c;促进航空产业、旅游、物流、紧急救援等多领域经济增长和产业融合。随着科技的不断进步和航空产业的快速发展&#xff0c;低空经济正逐渐成为全球经济的重要组成部分。 一、低空经济的主要特…

「珞石机器人」完成超5亿元战略+轮融资

珞石机器人ROKAE. 新一代智能机器人专家 近日&#xff0c;襄禾资本投资企业「珞石机器人」宣布完成超5亿元的战略轮融资&#xff0c;本次融资获得了国家制造业转型升级基金和邹城市新动能产业投资基金的共同加持&#xff0c;资金将主要用于市场开发、国际化开拓、产品升级迭代…

【excel】常用的50个函数与基础操作(文本函数)

1. LEFT 定义&#xff1a;输出单元格左边的N个字符 使用&#xff1a; LEFT&#xff08;单元格&#xff0c;输出几位&#xff09; 2. RIGHT 定义&#xff1a;输出单元格右边的N个字符 使用&#xff1a; RIGHT &#xff08;单元格&#xff0c;输出几位&#xff09; 3…

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

怎么使用下载视频号视频?详细视频下载使用教程

越来越多的人开始使用视频号等平台来分享和观看视频内容。然而&#xff0c;有时候我们可能会遇到需要将视频保存到本地设备以便离线观看或进一步编辑的情况。 本文将为您详细介绍如何使用视频下载plus&#xff0c;来下载视频号的视频内容。 一、了解视频号下载功能 首先&…

http忽略ssl认证

我们在发请求时&#xff0c;会遇到需要ssl证书验证的报错&#xff0c;针对该错误以及所使用的不同的创建连接的方式&#xff0c;进行ssl证书忽略 忽略SSL证书的流程 简介&#xff1a;需要告诉client使用一个不同的TrustManager。TrustManager是一个检查给定的证书是否有效的类…

【可下载】CDA 1级教材《精益业务数据分析》2023最新版

CDA一级认证教材&#xff1a;《精益业务数据分析》 全面、系统地讲述业务描述性分析为企业决策行为创造价值的全流程技能&#xff0c;涵盖描述性数据分析方法、业务分析方法、数据分析结果应用方法等内容。 条理清晰的结构、通俗易懂的语言、完整立体的知识框架为读者铺开一幅…

python逆向基础流程(纯小白教程)

一&#xff0c;例题链接 NSSCTF | 在线CTF平台 二&#xff0c;文件特征 使用工具查看文件信息&#xff0c;发现是pyinsatller打包的exe文件&#xff0c;如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑&#xff0c;所以思路是反编译成py文件直接分析python代码 三&#xf…