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

任务

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

同步任务和异步任务

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

同步执行和异步执行

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

为什么要异步编程

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

有些场景只能异步

比如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语言是如何从语言层面提供强大的异步编程能力的。

写在最后

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

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

  1. 王者荣耀10连胜,竟然也有人不相信,猎游大神带菜鸡玩家10连胜

    如果一局游戏一个人头都没有获得,甚至还送了几个人头,这一局游戏大家知道是胜利还是惨败?很多玩家都知道遇到这样的情况,这一局游戏基本上没有戏了,那就是根本不可能有太大的可能再获得胜利,特别是前期敌人顺风 ...

  2. 『中秋赏月』程序员用文心大模型带你玩转不一样的中秋

    『中秋赏月』文心大模型带你玩转不一样的中秋 中秋 文心大模型使用 安装wenxin_api 利用ERNIE-ViLG文生图模型生成图片 下载生成的图片 使用ERNIE 3.0模型,生成有关中秋的佳句 ...

  3. 大神带飞————动态生成对象并绑定父对象(绑定对象池中的对象使自己成为对象池中对象的子对象)

    实例代码 using System.Collections; using System.Collections.Generic; using UnityEngine; public class New ...

  4. SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本. create table t0718 (idx in ...

  5. 彻底了解C++异步从理论到实践

    1. 纠结的开篇 之前设计我们游戏用的c++框架的时候, 刚好c++20的coroutine已经发布, 又因为是专门 给game server用的c++ framework, 对多线程的诉求相对有限, ...

  6. P4编程理论与实践——理论篇(转载)

    P4编程理论与实践--理论篇 由于对SDN充满着兴趣,在学习了一段时间OpenFlow之后,一次偶然的机会接触到了P4.P4可以实现很多新的Idea,但是无奈于国内的实践资料太少了(有些资料似乎比较陈 ...

  7. 【2016年第6期】基于大数据的移动互联网主动运维理论和实践进展

    杨慰民 中国移动通信集团福建有限公司,福建 福州 350003 ‍‍摘要:‍对于非话音的移动互联网业务,即使网络指标是完好的,仍然存在用户感知不佳的现象.基于大数据技术研究用户感知和网络性能指标的关系 ...

  8. 老猪带你玩转自定义控件三——sai大神带我实现ios 8 时间滚轮控件

    ios 8 的时间滚轮控件实现了扁平化,带来很好用户体验,android没有现成控件,小弟不才,数学与算法知识不过关,顾十分苦恼,幸好在github上找到sai大神实现代码,甚为欣喜,顾把学习这个控件 ...

  9. 看看大神 Paul Graham 对如何学习编程的回答

    前言 我翻阅自己之前写的博客文章,发现在 2015 年我刚开始学习编程的时候,翻译了一段 Paul Graham 关于 "How can I learn to program?" ...

最新文章

  1. 来吧,用设计模式来干掉 if-else
  2. 05丨数据同步:主从库如何实现数据一致
  3. 排除网络故障课后习题参考答案
  4. 多线程实现生产者消费者
  5. 【WPF】如何获取命令行参数
  6. 在 Android 中调用二进制可执行程序(native executable )
  7. TCP/IP基础介绍
  8. 税控接口 - 模拟录入
  9. 服务器装系统报0x0000005d,Win8系统安装过程中提示ErrorCode:0x0000005D怎么办
  10. django全自动分库分表(横向)
  11. 动态壁纸安卓_酷玩软件第7期:还在用无声的动态壁纸?短视频壁纸软件(Win+安卓版本)...
  12. xml引入xml_XML Watch,蠕虫的哔哔声
  13. 计算机考研全国统考时段,考研初试各科目时间安排
  14. deepin允许root登录_deepin官网发布深度操作系统15.10
  15. java项目生成多个条码_java – 生成随机条形码 – 一个设计问题
  16. 大华摄像头java开发之抓图
  17. 分析用VBScript编写的网页***
  18. 超详细“CIDR地址块及其子网划分”
  19. 小白兔写话_二年级写话小白兔
  20. 迅雷和FlashGet 地址转换工具_6617.com

热门文章

  1. 【前端】静态数据和后台数据/echarts
  2. python 画曲线图_如何使用python画曲线图
  3. Redis重点六:怎么保证redis挂掉之后重启数据可以恢复?
  4. 安徽省网络课程中心e会学计算机答案,安徽省网络课程学习中心(e会学)
  5. 楼梯上有n阶台阶,上楼时可以一步上1阶,也可以一步上两阶,编写算法计算共有多少种不同的上楼梯的方法。
  6. 简单易用小技能:解决无线鼠标在有电情况下突然连接不了计算机的情况
  7. thinkphp5 实现短信注册验证功能
  8. 5 大分布式 ID 生成器优缺点简单对比
  9. qt设置反锯齿无效的解决办法
  10. 实体店铺如何运用会员营销获利?