前言

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

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

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

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

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

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

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

java异步编程教程 java异步编程实战pdf_开发语言

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

首先,可以先看一下目录

java异步编程教程 java异步编程实战pdf_java_02

其次,我们来看主要内容

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

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

java异步编程教程 java异步编程实战pdf_servlet_03

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

java异步编程教程 java异步编程实战pdf_java_04

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

java异步编程教程 java异步编程实战pdf_后端_05

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

java异步编程教程 java异步编程实战pdf_后端_06

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

java异步编程教程 java异步编程实战pdf_java_07

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

java异步编程教程 java异步编程实战pdf_java_08

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

java异步编程教程 java异步编程实战pdf_java_09

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

java异步编程教程 java异步编程实战pdf_后端_10

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

java异步编程教程 java异步编程实战pdf_java_11