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

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

任务

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

同步任务和异步任务

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

同步执行和异步执行

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

为什么要异步编程

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

有些场景只能异步

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

写在最后

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值