內(nèi)容簡介
這是一部全面解析Java異步編程的著作,針對各種常見異步編程場景,從編程語言、開發(fā)框架等角度深入講解了異步編程的原理和方法。作者是淘寶的資深Java技術(shù)工程師,在Java異步編程、并發(fā)編程領(lǐng)域有深厚的積累。
全書共9章,每章內(nèi)容概括如下:
第1-2章主要介紹了異步編程的概念、適用場景,以及如何使用線程和線程池來實(shí)現(xiàn)異步編程;
第3章首先講解JDK中的各種Future及其內(nèi)部實(shí)現(xiàn)原理,然后講解如何使用Future實(shí)現(xiàn)異步編程,以及如何結(jié)合JDK8 Stream 和Future實(shí)現(xiàn)異步編程;
第4章講解了Spring框架中提供的異步執(zhí)行能力,包含Spring中如何對TaskExecutor進(jìn)行抽象,如何使用注解@Async實(shí)現(xiàn)異步編程,以及其內(nèi)部實(shí)現(xiàn)原理;
第5章講解了比較熱門的反應(yīng)式編程相關(guān)的內(nèi)容,包含什么是反應(yīng)式編程,如何使用反應(yīng)式編程規(guī)范的庫RxJava和Reactor庫實(shí)現(xiàn)異步編程;
第6章講解了Web Servlet的異步非阻塞處理,包含Servlet 3.0規(guī)范是如何提供異步處理能力的,Servlet 3.1規(guī)范是如何解決IO阻塞問題的,以及在Spring MVC中如何進(jìn)行異步處理。
第7章講解與Servlet技術(shù)棧并行存在的、由Spring5.0提出來的Spring WebFlux的異步非阻塞處理,包含Spring WebFlux的由來、Spring WebFlux的并發(fā)模型、兩種編程模型,以及如何使用Spring WebFlux來進(jìn)行服務(wù)開發(fā)、Spring WebFlux內(nèi)部的實(shí)現(xiàn)原理。
第8章簡要介紹了業(yè)界為方便實(shí)現(xiàn)異步編程而設(shè)計(jì)的一些框架和中間件,比如異步基于事件驅(qū)動的網(wǎng)絡(luò)編程框架Netty,高性能RPC框架Apache Dubbo,高性能線程間消息傳遞庫Disruptor,異步基、分布式、基于事件驅(qū)動的編程框架Akka,高性能分布式消息平臺Apache RocketMQ 。
第9章介紹新興的Go語言是如何從語言層面提供了強(qiáng)大的異步編程能力的。
本書注重理論與實(shí)踐相結(jié)合,且每個(gè)異步技術(shù)點(diǎn)都附有代碼實(shí)例,幫助讀者加深理解。
(1)作者是淘寶的資深Java研發(fā)工程師,在Java異步編程和并發(fā)編程領(lǐng)域積累了豐富的經(jīng)驗(yàn)。
(2)本書得到了周志明、李運(yùn)華、毗盧、于君澤、方騰飛等Java技術(shù)領(lǐng)域的資深專家的一致好評和推薦。
(3)本書從JDK、Spring、Web Servlet、Netty、Dubbo、Go語言等框架和語言的角度全面講解了異步編程的原理和技巧,以及異步編程各種常見的適用常見。
(4)注重實(shí)戰(zhàn),每個(gè)技術(shù)知識點(diǎn)都配有案例代碼。
為何寫作本書
異步編程是可以讓程序并行運(yùn)行的一種手段,可以讓程序中的一個(gè)工作單元與主應(yīng)用程序線程分開獨(dú)立運(yùn)行,進(jìn)而提高應(yīng)用程序的性能和響應(yīng)能力等。
雖然Java為不同技術(shù)域提供了相應(yīng)的異步編程技術(shù),但是這些異步編程技術(shù)被散落到不同技術(shù)域的技術(shù)文檔中,沒有一個(gè)統(tǒng)一的文檔對其進(jìn)行梳理歸納。另外這些技術(shù)之間是什么關(guān)系,各自的出現(xiàn)都是為了解決什么問題,我們也很難找到相關(guān)資料來解釋。
本書的出現(xiàn)則是為了打破這種局面,旨在對Java中相關(guān)的異步編程技術(shù)進(jìn)行歸納總結(jié),為讀者提供一個(gè)統(tǒng)一文檔來查閱、參考。
本書特色
本書涵蓋了Java中常見的異步編程場景,包括單JVM內(nèi)的異步編程、跨主機(jī)通過網(wǎng)絡(luò)通信的遠(yuǎn)程過程調(diào)用的異步調(diào)用與異步處理,以及Web請求的異步處理等。
本書在講解Java中每種異步編程技術(shù)時(shí)都附有案例,以理論與實(shí)踐相結(jié)合的方式,幫助讀者更好地掌握相關(guān)內(nèi)容。
書中在講解每種異步編程技術(shù)時(shí)多會對其實(shí)現(xiàn)原理進(jìn)行講解,讓讀者知其然也知其所以然。
對于最近比較熱門的反應(yīng)式編程以及WebFlux的使用與原理解析,本書也有一定的深入探索。
本書讀者對象
本書適用于有一定Java編程基礎(chǔ),并對Java并發(fā)編程、Java異步編程、反應(yīng)式編程感興趣的讀者。
如何閱讀本書
對于初學(xué)者,建議按照本書編寫的章節(jié)順序進(jìn)行學(xué)習(xí),因?yàn)楸緯前凑諒囊椎诫y的順序編寫的,并且每章都有一些代碼示例供大家動手實(shí)踐,以便加深理解。如果你對Java并發(fā)編程與異步編程有一定的了解,那么可以直接從目錄查看感興趣的章節(jié)進(jìn)行學(xué)習(xí)。本書共分為9章,內(nèi)容概述如下:
第1章主要講解異步編程的概念和作用,以及在日常開發(fā)中都有哪些異步編程場景。
第2章講解最基礎(chǔ)的顯式使用線程和線程池來實(shí)現(xiàn)異步編程的方法,也分析了它們目前存在的缺點(diǎn)。
第3章內(nèi)容比較豐富,主要講解JDK中的各種Future,包括如何使用Future實(shí)現(xiàn)異步編程及其內(nèi)部實(shí)現(xiàn)原理,然后講解了如何結(jié)合JDK8 Stream 和Future實(shí)現(xiàn)異步編程。
第4章講解Spring框架中提供的異步執(zhí)行能力,包括在Spring中如何對TaskExecutor進(jìn)行抽象,如何使用注解@Async實(shí)現(xiàn)異步編程,以及其內(nèi)部實(shí)現(xiàn)原理。
第5章講解比較熱門的反應(yīng)式編程相關(guān)的內(nèi)容,包括什么是反應(yīng)式編程,如何使用反應(yīng)式編程規(guī)范的庫RxJava和Reactor實(shí)現(xiàn)異步編程。
第6章講解Web Servlet的異步非阻塞處理,包括Servlet 3.0規(guī)范是如何提供異步處理能力的,Servlet 3.1規(guī)范是如何解決IO阻塞問題的,以及如何在Spring MVC進(jìn)行異步處理。
第7章講解與Servlet技術(shù)棧并行存在的、由Spring5.0提出的Spring WebFlux異步非阻塞處理,包括Spring WebFlux的由來、Spring WebFlux的并發(fā)模型、兩種編程模型,以及如何使用Spring WebFlux來進(jìn)行服務(wù)開發(fā)、Spring WebFlux內(nèi)部的實(shí)現(xiàn)原理。
第8章簡要介紹了業(yè)界為方便實(shí)現(xiàn)異步編程而設(shè)計(jì)的一些框架和中間件,比如異步基于事件驅(qū)動的網(wǎng)絡(luò)編程框架Netty,高性能RPC框架Apache Dubbo,高性能線程間消息傳遞庫Disruptor,異步、分布式、基于事件驅(qū)動的編程框架Akka和高性能分布式消息框架Apache RocketMQ。
第9章介紹新興的Go語言是如何從語言層面提供強(qiáng)大的異步編程能力的。
資源和勘誤
有需要的讀者可以到https://github.com/zhailuxu/async-program-demo 下載本書的demo資源,由于筆者水平有限,如果你在閱讀本書時(shí)發(fā)現(xiàn)錯(cuò)誤,可以把錯(cuò)誤信息提交到華章網(wǎng)站(www.hzbook.com)。
致謝
首先要感謝機(jī)械工業(yè)出版社楊福川老師的團(tuán)隊(duì),他們擁有豐富的出版經(jīng)驗(yàn),在本書的命名以及目錄結(jié)構(gòu)調(diào)整上,給出了很多中肯的建議;其次要感謝我的家人,感謝他們對我的鼓勵(lì)與支持,讓我有充分的時(shí)間來寫作本書。
翟陸續(xù)(花名:加多)
資深Java研發(fā)工程師,就職于淘寶,有多年的Java研發(fā)經(jīng)驗(yàn),在Java并發(fā)編程、異步編程等方面有深入研究和積累。對JUC包源碼有深入的理解,熟悉常用開源框架實(shí)現(xiàn)原理。
著有暢銷書《Java并發(fā)編程之美》。
前言
第1章 認(rèn)識異步編程1
1.1 異步編程概念與作用1
1.2 異步編程場景2
1.3 總結(jié)9
第2章 顯式使用線程和線程池實(shí)現(xiàn)異步編程10
2.1 顯式使用線程實(shí)現(xiàn)異步編程10
2.2 顯式使用線程池實(shí)現(xiàn)異步編程14
2.2.1 如何顯式使用線程池實(shí)現(xiàn)異步編程14
2.2.2 線程池ThreadPoolExecutor原理剖析17
2.3 總結(jié)34
第3章 基于JDK中的Future實(shí)現(xiàn)異步編程35
3.1 JDK 中的Future35
3.2 JDK中的FutureTask37
3.2.1 FutureTask 概述37
3.2.2 FutureTask的類圖結(jié)構(gòu)41
3.2.3 FutureTask的run() 方法45
3.2.4 FutureTask的get()方法48
3.2.5 FutureTask的cancel(boolean mayInterruptIfRunning)方法50
3.2.6 FutureTask的局限性52
3.3 JDK中的CompletableFuture52
3.3.1 CompletableFuture 概述52
3.3.2 顯式設(shè)置CompletableFuture結(jié)果54
3.3.3 基于CompletableFuture實(shí)現(xiàn)異步計(jì)算與結(jié)果轉(zhuǎn)換56
3.3.4 多個(gè)CompletableFuture進(jìn)行組合運(yùn)算65
3.3.5 異常處理68
3.3.6 CompletableFuture概要原理70
3.4 JDK8 Stream & CompletableFuture76
3.4.1 JDK8 Stream76
3.4.2 當(dāng)Stream遇見CompletableFuture79
3.5 總結(jié)81
第4章 Spring框架中的異步執(zhí)行82
4.1 Spring中對TaskExecutor的抽象82
4.2 如何在Spring中使用異步執(zhí)行84
4.2.1 使用TaskExecutor實(shí)現(xiàn)異步執(zhí)行84
4.2.2 使用注解@Async實(shí)現(xiàn)異步執(zhí)行89
4.3 @Async注解異步執(zhí)行原理96
4.4 總結(jié)109
第5章 基于反應(yīng)式編程實(shí)現(xiàn)異步編程110
5.1 反應(yīng)式編程概述110
5.2 Reactive Streams規(guī)范120
5.3 基于RxJava實(shí)現(xiàn)異步編程123
5.4 基于Reactor實(shí)現(xiàn)異步編程133
5.5 總結(jié)136
第6章 Web Servlet的異步非阻塞處理137
6.1 Servlet概述137
6.2 Servlet 3.0 提供的異步處理能力138
6.3 Servlet 3.1 提供的非阻塞IO能力145
6.4 Spring Web MVC 的異步處理能力153
6.4.1 基于DeferredResult的異步處理154
6.4.2 基于Callable實(shí)現(xiàn)異步處理155
6.5 總結(jié)157
第7章 Spring WebFlux的異步非阻塞處理158
7.1 Spring WebFlux概述158
7.2 Reactive編程 & Reactor庫159
7.3 WebFlux服務(wù)器160
7.4 WebFlux的并發(fā)模型163
7.5 WebFlux對性能的影響164
7.6 WebFlux的編程模型164
7.6.1 WebFlux注解式編程模型165
7.6.2 WebFlux函數(shù)式編程模型168
7.7 WebFlux原理淺嘗171
7.7.1 Reactor Netty概述171
7.7.2 WebFlux服務(wù)器啟動流程173
7.7.3 WebFlux一次服務(wù)調(diào)用流程182
7.8 WebFlux的適用場景185
7.9 總結(jié)186
第8章 高性能異步編程框架和中間件187
8.1 異步、基于事件驅(qū)動的網(wǎng)絡(luò)編程框架Netty187
8.1.1 Netty概述187
8.1.2 Netty的線程模型190
8.1.3 TCP半包與粘包問題196
8.1.4 基于Netty與CompletableFuture實(shí)現(xiàn)RPC異步調(diào)用198
8.2 高性能RPC框架Apache Dubbo209
8.2.1 Apache Dubbo概述209
8.2.2 Dubbo的異步調(diào)用210
8.2.3 Dubbo的異步執(zhí)行214
8.3 高性能線程間消息傳遞庫Disruptor217
8.3.1 Disruptor概述217
8.3.2 Disruptor的特性詳解220
8.3.3 基于Disruptor實(shí)現(xiàn)異步編程223
8.4 異步、分布式、基于消息驅(qū)動的框架Akka227
8.4.1 Akka概述227
8.4.2 傳統(tǒng)編程模型存在的問題228
8.4.3 Actor模型解決了傳統(tǒng)編程模型的問題232
8.4.4 基于Akka實(shí)現(xiàn)異步編程237
8.5 高性能分布式消息框架Apache RocketMQ244
8.5.1 Apache RocketMQ概述244
8.5.2 基于Apache RocketMQ實(shí)現(xiàn)系統(tǒng)間異步解耦246
8.6 總結(jié)254
第9章 Go語言的異步編程能力255
9.1 Go語言概述255
9.2 Go語言的線程模型256
9.2.1 一對一模型256
9.2.2 多對一模型257
9.2.3 多對多模型258
9.2.4 Go語言的線程模型259
9.3 goroutine與channel261
9.3.1 goroutine261
9.3.2 channel265
9.3.3 構(gòu)建管道實(shí)現(xiàn)異步編程269
9.4 總結(jié)273