在應用中以任務的方式實現功能時,需要考慮到任務間的依賴關系。當任務強依賴上一個任務的結果時,任務間的消息通知就需要重視起來。任務間的消息通知分為同步和異步方式,同步就是消息的發送方要等待消息返回才能繼續處理其他事情,而異步就是不需要等待消息返回而是通過條件變量、信號量、回調等方式實現消息通知。
JDK提供了 「Future
」 來表示一個任務的執行結果。實現一個任務時需要實現 Runnable
或 Callable
結果,Future
可以檢測任務是否完成,獲取任務的執行結果,取消任務等。Future
是一個任務的句柄,從Future
可以獲取任務的狀態和執行結果,即使這個結果可能立即可用或者未來某個時間可用。「Promise
」 是一個可以寫入結果或異常的對象,只能寫入一次。Promise
表示 Future
的執行結果,成功或者異常。每個 Promise
關聯一個 Future
,對 Promise
進行寫入會使 Future
的值可用。
Future和Promise來源于函數式語言,其目的是分離一個值和產生值的方法,從而簡化異步代碼的處理。
因為JDK的 Future
支持的功能比較簡陋,Netty提供了 Future
的實現,擴展了 Future
的功能。
Netty中關于 Future
框架的實現位于 common
模塊中,至于在 transport
中的擴展如 ChannelFuture
這里沒有涉及,那部分內容只是 Future
的應用。
從IDEA生成的類圖來看Netty的關于 Future
的擴展有三類:
Future -> AbstractFuture -> CompleteFuture -> FailedFuture,SucceededFuture
。針對只需要關注任務的最終執行結果,中間不需要對任務執行成功或異常設置回調。AbstractFuture
提供了 get()
操作的實現,CompleteFuture
代表一個執行完畢的任務結果或異常。Netty的 Future
實現增加了添加和移除回調的方法,從而實現異步編程,回調或者說事件通知的實現是基于觀察者模式。Future
也支持同步獲取結果,但是JDK的 Future
的 get()
操作從語義上來說是一個獲取結果的方法,如果不是閱讀文檔完全獲取不到這個方法會阻塞線程直到能夠成功獲取結果或拋出異常。Netty提供了 await()
和 sync()
方法阻塞當前線程直到結果完成,從語義上來說 await()
用作需要等待任務完成,但是不需要獲取任務執行結果或無結果,sync()
用作需要同步阻塞且需要獲取結果的場景,當 sync()
執行結束后調用 get()
獲取執行結果。
Netty的 Promise
實現是通過繼承 Future
實現的,在 Promise
中提供了設置任務執行結果的方法。在 DefaultPromise
中提供了實現,關于回調的實現是一個觀察者模式的實現。在Netty的監聽器接口的頂層接口是JDK的 EventListener
接口,這是JDK的事件通知接口,相關的還有事件對象的類定義 EventObject
。值得注意的是回調地獄的問題,Netty默認回調的嵌套上限是8層。JDK8提供的 CompletableFuture
支持對 Future
進行計算,而不是 Future
的結果從而解決了開發中需要用到的多重回調問題。
Netty還提供了ProgressiveFuture
和 ProgressivePromise
抽象,這是為了解決任務處理不同的階段需要進行不同的處理的問題,如下載任務,需要不斷反饋下載進度,又或者如支持依賴的調度任務進行到不同階段需要觸發不同的任務執行。ProgressivePromise
主要增加了setProgress()
和 tryProgress()
方法。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态