前言

本文由淘宝资深java技术专家爆肝整理分享的java异步编程实战文档,针对常见异步编程场景,从编程语言、开发框架等角度深入讲解异步编程的原理和方法,每个技术点都附有案例代码!

通常Java开发人员喜欢使用同步代码编写程序,因为这种请求(request)/响应(response)的方式比较简单,并且比较符合编程人员的思维习惯;这种做法很好,直到系统出现性能瓶颈。在使用同步编程方式时,由于每个线程同时只能发起一个请求并同步等待返回,所以为了提高系统性能,此时我们就需要引入更多的线程来实现并行化处理。

但是多线程下对共享资源进行访问时,不可避免会引入资源争用和并发问题;另外,操作系统层面对线程的个数是有限制的,不可能通过无限增加线程数来提供系统性能;而且,使用同步阻塞的编程方式还会浪费资源,比如发起网络IO请求时,调用线程就会处于同步阻塞等待响应结果的状态,而这时候调用线程明明可以去做其他事情,等网络IO响应结果返回后再对结果进行处理。

可见通过增加单机系统线程个数的并行编程方式并不是“灵丹妙药”。通过编写异步、非阻塞的代码,则可以使用相同的底层资源将执行切换到另一个活动任务,然后在异步处理完成后再返回到当前线程继续处理,从而提高系统性能。

异步编程是可以让程序并行运行的一种手段,其可以让程序中的一个工作单元与主应用程序线程分开独立运行,并且在工作单元运行结束后,会通知主应用程序线程它的运行结果或者失败原因。使用异步编程可以提高应用程序的性能和响应能力等。

比如当调用线程使用异步方式发起网络IO请求后,调用线程就不会同步阻塞等待响应结果,而是在内存保存请求上下文后,马上返回去做其他事情,等网络IO响应结果返回后再使用IO线程通知业务线程响应结果已经返回,由业务线程对结果进行处理。可见,异步调用方式提高了线程的利用率,让系统有更多的线程资源来处理更多的请求。

比如在移动应用程序中,在用户操作移动设备屏幕发起请求后,如果是同步等待后台服务器返回结果,则当后台服务操作非常耗时时,就会造成用户看到移动设备屏幕冻结(一直处于请求处理中),在结果返回前,用户不能操作移动设备的其他功能,这对用户体验非常不好。而使用异步编程时,当发起请求后,调用线程会马上返回,具体返回结果会通过UI线程异步进行渲染,且在这期间用户可以使用移动设备的其他功能。

 

本文将从目录、主要内容和文章总结三部分的内容,给大家进行java异步编程实战文档的介绍,希望大家能够喜欢!!!

首先,可以先看一下目录

 

其次,我们来看主要内容

本文是按照从简到难的顺序编写的,并且每章都有一些代码示例让大家可以动手实践,以便加深理解。如何你对Java并发编程与异步编程有一定的基础,那么你可以直接从目录查看感兴趣的章节进行学习。本文总共分为9个章节,内容如下:

第1章认识异步编程;本章我们首先概要介绍了异步编程的概念与作用,让大家对异步编程有一个大致的了解;然后讲解了Java中异步编程的场景,让大家通过实际场景案例进一步了解异步编程是什么,以及不同异步编程场景应使用什么技术来实现。

 

第2章显式使用线程和线程池实现异步编程;本章首先探讨了 Java 中最基础的显式创建线程的方式来实现异步编程,并指出了其存在的三个问题;然后讲解了显式使用线程池来实现异步编程,并且讲解了线程池的实现原理 虽然线程池方式提供了线程复用可以获取任务返回值,但是获取返回值时还是需要阻塞调用线程的,所以我们在下一章会讲解 JDK 提供的 ompletableFuture 来解决这个问题。

 

第3章基于JDK中的Future实现异步编程;本章我们首先讲解了如何使用 FutureTask 实现异步编程及其缺点,然后讲解了Completabl Future 如何解决其缺点,以及 CompletableFuture JDK Stream 是如何完美结合的,可知使用 CompletableFuture 实现异步编程属于声明式编程, 般情况下不需要我们显式创建线程池并提交任务到线程池,这大大减轻了编程者的负担 另外本章多为实践类型,希望大家可以动手实践本章实例,以加深理解。

 

第4章Spring框架中的异步执行;本章我们讲解了如何使用 Spring 框架中的@ sync 进行异步处理,以及其内部如何使用代理的方式来实现,并且可知使用@ sync 实现异步编程属于声明式编程,一般情况下不需要我们显式创建线程池并提交任务到线程池,这大大减轻了编程者的负担希望读者可以自己翻看代码进行更深层的研究。

 

第5章基于反应式编程实现异步编程;本章首先讲解了传统的基于CallBack与 Future实现异步编程的缺点,然后探讨使用Reactive编程能给我们带来什么好处,最后讲解了如何基于RxJava与Reactor库来实现异步编程。本章只讲解了Reactive编程的一些特性,想了解更多特性的话可以去官网查看学习。

 

第6章Web Servlet的异步非阻塞处理;本章我们首先探讨了Servlet 3.0前的Servlet同步处理模型及其缺点,然后探讨了Servlet 3.0提供的异步处理能力与Servlet 3.1的非阻塞IO能力,以及Spring MVC中提供的异步处理能力。学习完本章后大家可以写个demo实践一下,并在关键点加入断点进行debug跟踪,以便加深理解。

 

第7章Spring WebFlux的异步非阻塞处理;本章主要讲解了Spring 5.0引入的新的异步非阻塞的WebFlux技术栈,其与Servlet技术栈是并行存在的。WebFlux从规范上支持异步处理,基于Reactor库天然支持反应式编程,并且其使用少量固定线程来实现系统可伸缩性,相信在不久的将来会得到大范围使用。

 

第8章高性能异步编程框架和中间件;本章我们概要介绍了一些高性能异步编程框架和中间件,供大家拓展知识使用。如果大家对某个组件感兴趣,可以深入进行研究。

 

第9章Go语言的异步编程能力;本章我们首先讲解了Go语言的线程模型,然后讲解了比较重要的并发原语goroutine与channel,最后基于goroutine与channel构建了一个管道,并且通过例子体验了使用管道进行异步编程,以及回压功能的实现。

 

这份【java异步编程实战】共有287页,需要完整版的朋友,可以转发此文关注小编,扫码来获取!!

最后,我们对整篇文章做个总结

 

行业专家的评价

  1. 异步与并发处理能力几乎已经成为软件系统的必备能力,现代的程序语言、运行平台和框架都提供了全面的支持,但是开发人员不能指望它们解决所有相关的问题,所以洞悉异步与并发的技术内幕是高级程序员的必修课。本文对Java异步编程相关的技术进行了深入、系统的归纳和总结,是非常优秀的学习材料。
  2. 异步编程是高性能程序的利器,同时也是程序员面临的挑战之一,要想写出优秀的异步编程代码,既需要对异步编程的原理有深刻的理解,也需要对各种异步编程框架有全面的掌握。本文涵盖了异步编程的方方面面,既有原理和框架的深入阐述,又对实战代码进行了展示,是全面和系统掌握异步编程的不二之选。
  3. 本文深入浅出地介绍了Java异步编程的基本概念以及常用场景,是Java程序员进阶的必读之书。
  4. 全面解析异步编程的好书,从JDK Future 到Reactor.从Netty到Disruptor,辅以案例,内容丰富,值得一读。
  5. 本文从编程框架和编程语言等维度讲解了如何进行异步编程,比如SpringWebFlux和Dubbo等框架,以及Java和Go等语言。相信大家在看完本书之后,能够全方位、立体化掌握异步编程的技巧。

希望本文能够帮助到大家的学习,不断地提高大家的技术深度和广度,让自己变得更加有价值,也希望本文能够得到大家的喜欢!

奋斗,努力成就更好的自己!!