通常Java開發(fā)人員喜歡使用同步代碼編寫程序,因為這種請求(request) /響應(yīng)(response) 的方式比較簡單,并且比較符合編程人員的思維習(xí)慣;這種做法很好,直到系統(tǒng)出現(xiàn)性能瓶頸。在使用同步編程方式時,由于每個線程同時只能發(fā)起一個請求 并同步等待返回, 所以為了提高系統(tǒng)性能,此時我們就需要引入更多的線程來實現(xiàn)并行化處理。但是多線程下對共享資源進(jìn)行訪問時,不可避免會引入資源爭用和并發(fā)問題;另外,操作系統(tǒng)層面對線程的個數(shù)是有限制的,不可能通過無限增加線程數(shù)來提供系統(tǒng)性能;而且,使用同步阻塞的編程方式還會浪費資源,比如發(fā)起網(wǎng)絡(luò)IO請求時,調(diào)用線程就會處于同步阻塞等待響應(yīng)結(jié)果的狀態(tài),而這時候調(diào)用線程明明可以去做其他事情,等網(wǎng)絡(luò)IO響應(yīng)結(jié)果返回后再對結(jié)果進(jìn)行處理。
可見通過增加單機(jī)系統(tǒng)線程個數(shù)的并行編程方式并不是“靈丹妙藥”。通過編寫異步、非阻塞的代碼,則可以使用相同的底層資源將執(zhí)行切換到另一個活動任務(wù),然后在異步處理完成后再返回到當(dāng)前線程繼續(xù)處理,從而提高系統(tǒng)性能。
異步編程是可以讓程序并行運行的一種手段,其可以讓程序中的一個工作單元與主應(yīng)用程序線程分開獨立運行,并且在工作單元運行結(jié)束后,會通知主應(yīng)用程序線程它的運行結(jié)果或者失敗原因。使用異步編程可以提高應(yīng)用程序的性能和響應(yīng)能力等。
比如當(dāng)調(diào)用線程使用異步方式發(fā)起網(wǎng)絡(luò)IO請求后,調(diào)用線程就不會同步阻塞等待響應(yīng)結(jié)果,而是在內(nèi)存保存請求上下文后,馬上返回去做其他事情,等網(wǎng)絡(luò)IO響應(yīng)結(jié)果返回后再使用IO線程通知業(yè)務(wù)線程響應(yīng)結(jié)果已經(jīng)返回,由業(yè)務(wù)線程對結(jié)果進(jìn)行處理??梢姡惒秸{(diào)用方式提高了線程的利用率,讓系統(tǒng)有更多的線程資源來處理更多的請求。比如在移動應(yīng)用程序中,在用戶操作移動設(shè)備屏幕發(fā)起請求后,如果是同步等待后臺服務(wù)器返回結(jié)果,則當(dāng)后臺服務(wù)操作非常耗時時,就會造成用戶看到移動設(shè)備屏幕凍結(jié)(一 直處于請求處理中),在結(jié)果返回前,用戶不能操作移動設(shè)備的其他功能,這對用戶體驗非常不好。而使用異步編程時,當(dāng)發(fā)起請求后,調(diào)用線程會馬上返回,具體返回結(jié)果會通過UI線程異步進(jìn)行渲染,且在這期間用戶可以使用移動設(shè)備的其他功能。
今天分享這份學(xué)習(xí)筆記就是一份Java異步編程的頂級教程筆記!
由于筆記的內(nèi)容過多,下面只能為大家展示部分內(nèi)容,完整藍(lán)光版免費的獲取方式在文末!
詳細(xì)章節(jié)目錄



第1章認(rèn)識異步編程
本章主要介紹異步編程的概念與作用,Java中 異步編程的場景以及不同異步編程場景應(yīng)使用什么技術(shù)來實現(xiàn)。

第2章顯式使用線程和線程池實現(xiàn)異步編程
本章主要探討如何顯式地使用線程和線程池實現(xiàn)異步編程,這包含如何顯式使用線程實現(xiàn)異步編程以及使用線程編程的缺點,如何顯式使用線程池實現(xiàn)異步編程以及線程池實現(xiàn)原理。

第3章基于JDK中的Future實現(xiàn)異步編程
本章主要講解如何使用JDK中的Future實現(xiàn)異步編程,這包含如何使用FutureTask實現(xiàn)異步編程及其內(nèi)部實現(xiàn)原理;如何使用CompletableFuture實現(xiàn)異步編程及其內(nèi)部實現(xiàn)原理,以及CompletableFuture與JDK Stream如何完美結(jié)合的。

第4章Spring框架中的異步執(zhí)行
在Spring Framework中分別使用TaskExecutor和TaskScheduler接口提供異步執(zhí)行和任務(wù)調(diào)度的抽象,本章我們著重講解基于TaskExecutor支撐的注解@Asyne是如何實現(xiàn)異步處理的。

第5章基于反應(yīng)式編程實現(xiàn)異步編程
本章主要講解如何使用反應(yīng)式編程實現(xiàn)異步編程,其包含了什么是反應(yīng)式編程,為何需要反應(yīng)式編程,反應(yīng)式編程特點與價值是什么,以及如何基于反應(yīng)式編程實現(xiàn)庫RxJava與Reactor實現(xiàn)異步編程。

第6章Web Servlet的異步非阻塞處理
本章主要探討Servlet3.0規(guī)范前的同步處理模型和缺點,Servlet3.0規(guī)范提供的異步處理能力與Servlet3.1規(guī)范提供的非阻塞I0能力,以及Spring MVC中提供的異步處理能力。

第7章Spring WebFlux的異步非阻塞處理
本章主要講解Spring框架5.0中引入的新的WebFlux技術(shù)棧,并介紹其存在的價值與意義、并發(fā)模型與適用場景、如何基于WebFlux實現(xiàn)異步編程,以及其內(nèi)部的實現(xiàn)原理。

第8章高性能異步編程框架和中間件
本章主要介紹一些高性能異步編程框架和中間件,這包含異步、基于事件驅(qū)動的網(wǎng)絡(luò)編程框架一Netty; 高性能RPC框架一Apache Dubbo;高性能線程間消息傳遞庫一Disruptor;異步、分布式、基于消息驅(qū)動的框架一Akka; 高性能分布式消息框架一Apache RocketMQ。

第9章Go語言的異步編程能力
本章主要講解Go語言的異步編程能力,這包含Go語言的線程模型,以及如何使用原語goroutine與channel實現(xiàn)異步編程,最后基于goroutine與channel構(gòu)建了一個支持回壓、異步編程的管道。

有需要藍(lán)光版Java異步編程筆記的朋友:點我獲取