大神带你玩转异步编程,理论与实践齐飞,敢说是目前最全的讲解了

news2025/7/9 5:53:55

要完全理解异步编程需要先理解几个概念

任务

我给任务的定义是完成某项功能的单元模块,任务有大有小,站在操作系统的角度,一个程序就是一个任务,每当运行一个程序就会创建一个新的任务,它在操作系统中还有一个无人不知的名字:进程。站在编程的角度任务指我们编写的一系列函数,每个函数完成一个特定的功能(任务),一般我们首先构建出最基本的任务,然后组合这些基本的任务构建一些复杂的任务,程序的大厦就是这样一步步建立起来的。

同步任务和异步任务

同步任务和异步任务描述的是任务执行本身的特征。同步任务指这个任务执行后一直要等到有了预期的结果才会返回,比如定义一个函数执行一个数学计算。异步任务指这个任务执行后在还没有得到预期的结果时就立马返回,所以异步任务一般会有一个或多个回调函数,在任务完成后会通过回调通知调用者。

同步执行和异步执行

同步执行和异步执行描述的是任务的结果顺序和执行顺序是否一致。同步执行指在要执行的多个任务里,不管任务是否异步,后一个任务必须要等到前一个任务取得了预期的结果才能执行,即任务的结果顺序和执行顺序是一致的,是同步的。比如说具有依赖关系的多个异步任务,它们本身虽然是异步执行的,但是它们的整体执行顺序是同步的,所以它们还是同步执行的。异步执行指在包含异步任务的多个任务里,不需要异步任务有了预期的结果就立即执行其它任务,它们可以同时进行(并行),究竟是何种方式取决于系统资源(多核、单核)以及任务的调度方式,所以后执行的可能先有结果,即结果顺序和执行顺序不一致,是异步的。

为什么要异步编程

同步通常更符合人的思维习惯,所以同步编程的代码通常结构清晰,容易理解,任务之间的调用顺序通常就代表了它们的执行顺序。但异步编程就完全不同了,任务与任务之间没有明确的时序关系,一个任务何时结束我们也不知道,只能在回调里面才能进行下一步动作,这样就打乱了我们思维的连贯性,所以必须小心翼翼,很容易出错。既然异步编程有这么大的缺点,为什么还要异步编程呢,我觉得理由有两点

有些场景只能异步

比如UI线程,它不能被阻塞,必须快速响应各种事件,这样才能保持用户交互界面的流畅。还有就是JS执行环境,都知道它是单线程的,而且它的执行和UI线程有直接的关系,所以它也不能被阻塞。

异步具有更高的效率

任务一般分为IO密集型和CPU密集型,不同类型的任务是可以同时执行的也就是真正意义上的并行,即使同种类型的任务也能并行,比如一个访问内存,一个读写硬盘,一个在CPU核1运行,一个在CPU核2运行,只要它们访问的资源没有冲突,之间没有依赖,那么我们就没必要等到一个任务执行完成才执行下一个任务。所以异步能充分利用系统资源,在相同的时间内可以做更多的事情,它拥有更高的效率。

虽然Java为不同技术域提供了相应的异步编程技术,但是这些异步编程技术被散落到不同技术域的技术文档中,没有一个统一的文档对其进行梳理归纳。另外这些技术之间是什么关系,各自的出现都是为了解决什么问题,我们也很难找到相关资料来解释。但是前些时间在网上看到一份淘宝一位大牛整理出来的文档却打破了这种局面,这份文档涵盖了Java中常见的异步编程场景,理论与实践相结合,感觉很不错,跟大家分享一下

这份文档是从易到难的顺序编写的,并且每章都有一些代码示例供大家动手实践,这份文档共分为9章,内容概述如下:

第1章 认识异步编程

  • 异步编程概念与作用
  • 异步编程场景

提到异步编程的概念和作用,以及在日常开发中都有哪些异步编程场景。

第2章 显式使用线程和线程池实现异步编程

  • 显式使用线程实现异步编程
  • 显式使用线程池实现异步编程

提到最基础的显式使用线程和线程池来实现异步编程的方法,也分析了它们目前存在的缺点。

第3章 基于JDK中的Future实现异步编程

  • JDK中的Future
  • JDK中的FutureTask
  • JDK中的CompletableFuture
  • JDK8 Stream & CompletableFuture

提到JDK中的各种Future,包括如何使用Future实现异步编程及其内部实现原理,然后讲解了如何结合JDK8.Stream和Future实现异步编程。

第4章 Spring框架中的异步执行

  • Spring中对TaskExecutor的抽象
  • 如何在Spring中使用异步执行
  • @Async注解异步执行原理

提到Spring框架中提供的异步执行能力,包括在Spring中如何对TaskExecutor进行抽象,如何使用注解@Async实现异步编程,以及其内部实现原理。

第5章 基于反应式编程实现异步编程

  • 反应式编程概述
  • Reactive Streams规范
  • 基于RxJava实现异步编程
  • 基于Reactor实现异步编程

讲解比较热门的反应式编程相关的内容,包括什么是反应式编程,如何使用反应式编程规范的库RxJava和Reactor实现异步编程。

第6章 Web Servlet的异步非阻塞处理

  • Servlet概述
  • Servlet 3.0提供的异步处理能力
  • Servlet 3.1提供的非阻塞|O能力
  • Spring Web MVC的异步处理能力

讲解WebServlet的异步非阻塞处理,包括Servlet3.0规范是如何提供异步处理能力的,Servlet3.1规范是如何解决IO阻塞问题的,以及如何在SpringMVC进行异步处理。

第7章 Spring WebFlux的异步非阻塞处理

  • Spring WebFlux概述
  • Reactive编程& Reactor库
  • WebFlux服务器
  • WebFlux的并发模型
  • WebFlux对性能的影响
  • WebFlux的编程模型
  • WebFlux原理浅尝
  • WebFlux的适用场景

讲解与Servlet技术栈并行存在的、由Spring5.0提 出的SpringWebFlux异步非阻塞处理,包括Spring WebFlux的由来、Spring WebFlux的并发模型、两种编程模型,以及如何使用Spring WebFlux来进行服务开发、Spring WebFlux内部的实现原理。

第8章 高性能异步编程框架和中间件

  • 异步、基于事件驱动的网络编程框架- Netty
  • 高性能RPC框架一Apache Dubbo
  • 高性能线程间消息传递库一Disruptor
  • 异步、分布式、基于消息驱动的框架- Akka
  • 高性能分布式消息框架Apache RocketMQ

简要介绍了业界为方便实现异步编程而设计的一些框架和中间件,比如异步基于事件驱动的网络编程框架Netty,高性能RPC框架Apache Dubbo,高性能线程间消息传递库Disruptor,异步、分布式、基于事件驱动的编程框架Akka和高性能分布式消息框架ApacheRocketMQ。

第9章 Go语言的异步编程能力

  • Go语言概述
  • Go语言的线程模型
  • goroutine与channel

介绍新兴的Go语言是如何从语言层面提供强大的异步编程能力的。

写在最后

程序员对性能的追求总是孜孜不倦的,异步作为提高性能最重要的方法也在不断的被研究,随着人们对异步理解的深入,相信还会有更好的方法被提出。

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

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

相关文章

软件需求分析——需求工程过程

如果有兴趣了解更多相关内容,可以来我的个人网站看看:瞳孔空间 一:相关概念 需求工程过程的目的:介绍为软件加强型系统中的复杂软件设计的需求工程过程,涉及 抽取需求分析需求验证需求管理需求 主要关注点&#xf…

Isaac-gym(7):物理模拟(actor生成、创建、控制等)

1. 创建actor 1.1 actor的创建与句柄 actor是GymAsset的实例。函数create_actor将一个参与者添加到环境中,并返回一个参与者句柄,该句柄可用于以后与该参与者交互。出于性能原因,最好在actor创建期间保存句柄,而不是在模拟运行时…

[同向双指针] 209. 长度最小的子数组 713. 乘积小于 K 的子数组 3. 无重复字符的最长子串

同向双指针 该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1hd4y1r7Gq 该类滑动窗口一般符合某种单调性。 当不满足条件时左指针后移,当满足条件时右指针后移。 假设数组长度为 n,左指针最多移动 n 次,右指针最…

【无人机】基于RRT算法实现四旋翼无人机的安全和最小能量轨迹规划附matlab代码和报告

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Linux安装RabbitMQ步骤分享

1、Erlnag安装 1.1、 安装Erlang版本要求 Erlang安装需要对应各自的版本 RabbitMQ Erlang Version Requirements — RabbitMQ 1.2、 Erlang安装 1、目录准备 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq2、添加仓库地址 为了减少安装的错误 我们使用仓库安装 ,类似于m…

【算法篇-数论】快速幂

快速幂1. 利用快速幂优化的时间复杂度2. 快速幂方法及代码3.总结文章参考自 B站董晓算法 1. 利用快速幂优化的时间复杂度 所谓的快速幂就是快速计算底数的n次幂暴力求幂的话时间复杂度为O(n) 利用快速幂可以做到 时间复杂度为 O(log2n) 2. 快速幂方法…

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类 2022找工作是学历、能力和运气的超强结合体,遇到寒冬&#xf…

一、什么是 MQ

MQ的概念 MQ (Message Queue)消息队列,是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。 队列是基础数据结构中 “先进先出” 的一种数据结构。 消息对列,指把要传输的数据消息放在队列中,用队列机制…

SpringBoot:速成总结+实战——员工管理系统

这篇文章先是总结SpringBoot,当然我很多源码都没有仔细的去抠,而且这样一个成熟的框架想都不用想就知道源码很复杂,先学框架怎么用。接着就用SpringBoot完成一个较为简单的项目:员工管理系统。 目录端口号被占用怎么办什么是Sprin…

Hadoop总结——Hadoop基础

一、Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 主要解决,海量数据的存储和海量数据的分析计算问题 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈 二、Hadoop发展历史 1)Lucene--Doug Cutting开…

python中深拷贝和浅拷贝的区别

文章目录值的引用浅拷贝可变数据类型与不可变数据类型不可变数据类型可变数据类型深拷贝深拷贝浅拷贝总结若将需要注释若干行,则将这些行选中,然后按住 ctrl / 键就可以了,再按一次,即可取消多行注释若要批量缩进,那么…

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸(phosphatidylserine,PS)又称丝氨酸磷脂,二酰甘油酰磷酸丝氨酸,简称PS,是一类普遍存在的磷脂,通常位于细胞膜的内层,磷酯化合物中的磷酸甘油酯类,是细胞膜组…

QGIS创建要素与属性

QGIS之矢量操作——创建要素与属性 创建要素 打开常用的工具条:View—Toolbar 这样常用的工具条就加载进来了 新建矢量图层,并设置字段等等: 创建属性,选中你的矢量图层,右键选择Toggle_Editing(或者点击…

SpringBoot项目上线运维

文章目录一.高级属性配置1.1 简介1.2 临时属性设置1.3 配置文件的四级分类1.4 自定义配置文件二.多环境开发2.2 多环境开发(yaml版)2.3 多环境开发多文件版(yaml版)2.4 多环境开发(Properties版)2.5 多环境…

这次把怎么做好一个PPT讲清-画图篇

文章目录概述布尔运算PPT幻灯片中如何设置形状对象格式每一个图形既是一个形状,又是一个文本框如何用PPT来实现三维3D效果,附参数设置详解怎么用ppt画三维立体图?**PPT做3D可动样机****PPT做3D[动态图标]****PPT做3D插画**如何使用[PPT绘图]&#xff1f…

图像处理:图像清晰度评价

目录 0、实现效果 1、概述 2、模糊度分类 1、运动模糊 2、压缩模糊 3、高斯模糊 3、清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts Laplace SMD(灰度方差)函数 SMD2 (灰度方差乘积)函数 …

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程,那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出; 同样我们写了一个C语言程序,但是在这个程序中是有两个进程,我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样,网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——置顶、加精、删除

添加依赖,去掉版本 实现置顶、加精的修改,删除 首先开发数据访问层,因为是对帖子的操作所以无论是置顶、加精最终是要修改帖子,先打开DiscussPostMapper增加修改的操作,一个修改类型,一个修改状态。 打…