什麼是非同步?5大非同步程式設計實現詳解!
來源:mikechen的網際網路架構
什麼是非同步?與同步有什麼區別?非同步的是如何實現?有哪些非同步實現方式?這些是經常大廠考察的點,下面我一一來全面來詳解非同步程式設計
什麼是非同步?
首先我們先來看看一個同步的使用者註冊例子,流程如下:
在同步操作中,我們執行到插入資料庫的時候,我們必須等待這個方法徹底執行完才能執行“傳送簡訊”這個操作,如果插入資料庫這個動作執行時間較長,傳送簡訊需要等待,這就是典型的同步場景。
於是聰明的人們開始思考,如果兩者關聯性不強,能不能將一些非核心業務從主流程中剝離出來,於是有了非同步程式設計雛形,改進後的流程如下:
這就是非同步程式設計,它是程式併發執行的一種手段,它允許多個事件同時發生,當程式呼叫需要長時間執行的方法時,它不會阻塞當前的執行流程,程式可以繼續執行。
在聊完非同步程式設計後,那麼我們一起來看看Java裡面實現非同步程式設計究竟有哪些方式呢?
一、執行緒非同步
在 Java 語言中最簡單使用非同步程式設計的方式就是建立一個 執行緒來實現,如果你使用的 JDK 版本是 8 以上的話,可以使用 Lambda 表示式 會更加簡潔。
當然如果每次都建立一個 Thread執行緒,頻繁的建立、銷燬,浪費系統資源,我們可以採用執行緒池:
將業務邏輯封裝到 Runnable 或 Callable 中,交由 執行緒池 來執行。
二、Future非同步
上述方式雖然達到了多執行緒並行處理,但有些業務不僅僅要執行過程,還要獲取執行結果,後續提供在JUC包增加了Future。
從字面意思理解就是未來的意思,但使用起來卻著實有點雞肋,並不能實現真正意義上的非同步,獲取結果時需要阻塞執行緒,或者不斷輪詢。
三、CompletableFuture非同步
Future 類透過 get() 方法阻塞等待獲取非同步執行的執行結果,效能比較差。
JDK1.8 中,Java 提供了 CompletableFuture 類,它是基於非同步函數語言程式設計。相對阻塞式等待返回結果,CompletableFuture 可以透過回撥的方式來處理計算結果,實現了非同步非阻塞,效能更優。
CompletableFuture 實現了 Future 和 CompletionStage 介面, 並提供了多種實現非同步程式設計的方法,如supplyAsync, runAsync以及thenApplyAsync。
下面我們使用CompletableFuture來實現上面的例子:
我們不需要顯式使用 ExecutorService,CompletableFuture 內部使用了 ForkJoinPool 來處理非同步任務,這使得我們的程式碼變的更簡潔。
四、SpringBoot @Async非同步
在@Async註解之前,使用多執行緒需要使用JDK的原生方法,非常麻煩,當有了@Async之後就比較簡單了。
首先,使用 @EnableAsync 啟用非同步註解:
自定義執行緒池:
在非同步處理的方法上新增註解 @Async
,當對 execute 方法
呼叫時,透過自定義的執行緒池 defaultThreadPoolExecutor
非同步化執行 execute 方法
用 @Async 註解標記的方法,稱為非同步方法。在spring boot應用中使用 @Async 很簡單:
呼叫非同步方法類上或者啟動類加上註解 @EnableAsync 在需要被非同步呼叫的方法外加上 @Async 所使用的 @Async 註解方法的類物件應該是Spring容器管理的bean物件;
五、Guava非同步
Guava 提供了 ListenableFuture 類來執行非同步操作
1.首先我們需要新增 guava 的maven依賴:
2.現在我們使用ListenableFuture來實現我們之前的例子:
這裡使用MoreExecutors獲取ListeningExecutorService類的例項,然後ListeningExecutorService.submit執行非同步任務,並返回 ListenableFuture例項。
非同步程式設計小結
非同步程式設計受到了越來越多的關注,尤其是在 IO 密集型的業務場景中,相比傳統的同步開發模式,非同步程式設計的優勢越來越明顯。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-3006722/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS 為什麼app都是非同步程式設計iOSAPP非同步程式設計
- 記錄--localStorage是同步還是非同步的?為什麼?非同步
- Flutter非同步程式設計詳解Flutter非同步程式設計
- React 中 setState() 為什麼是非同步的?React非同步
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 非同步程式設計方案----Promise實現小解非同步程式設計Promise
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- Django是同步框架還是非同步框架Django框架非同步
- python 網路程式設計----非阻塞或非同步程式設計Python程式設計非同步
- 如何給女朋友解釋什麼是IO中的阻塞、非阻塞、同步、非同步?非同步
- javascript實現的非同步功能詳解JavaScript非同步
- 架構設計 | 非同步處理流程,多種實現模式詳解架構非同步模式
- Promise是如何實現非同步程式設計的?Promise非同步程式設計
- 非同步程式設計在ArkTS中具體怎麼實現?非同步程式設計
- React setState是非同步嗎?React非同步
- 非同步程式設計最佳實踐非同步程式設計
- 非同步程式設計非同步程式設計
- javascript非同步程式設計(一)-現狀JavaScript非同步程式設計
- JS非同步程式設計之Promise詳解和使用總結JS非同步程式設計Promise
- Dart 非同步程式設計詳解之一文全懂Dart非同步程式設計
- 快速瞭解非同步程式設計 RxJava非同步程式設計RxJava
- RedisSyncer同步引擎的設計與實現Redis
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- setState可能是非同步的非同步
- jQuery動畫都是非同步的jQuery動畫非同步
- hashchang事件是非同步更新的事件非同步
- 什麼是資料實時同步,為什麼資料實時同步很重要
- C++ concurrency::task實現非同步程式設計(WindowsC++非同步程式設計Windows
- ES7之async/await 同步還是非同步AI非同步
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步、阻塞、非阻塞非同步
- Javascript非同步程式設計之setTimeout與setInterval詳解分析(一)JavaScript非同步程式設計
- python中非同步非阻塞如何實現Python非同步