天天看點

源碼解析:Netty 如何擴充實作Future 和 Promise 接口

前言

Netty 的大部分使用者接口都是異步化的,傳回的都是一個

ChannelFuture

對象。該接口是 Netty 對 JDK 中的

Future

接口擴充而來。和開發者相關比較大的變化是允許添加一個

GenericFutureListener

監聽器,以便在異步任務完成時觸發回調任務。

接口的定義比較簡單,不過如何保證并發的安全性則是一個值得思考的問題。假定在任務完成的瞬間,

addListener

方法被調用,回調方法是否一定被觸發?下面帶着問題來看源碼

類層次

首先讓我們來看下類層次圖。

源碼解析:Netty 如何擴充實作Future 和 Promise 接口

雖然大部分使用者接口代碼傳回都是 ChannelFuture,但是實際上真正生效的是接口

ChannelPromise

。從

Promise

接口繼承的能力,使得該接口允許設定成功或者失敗辨別。下面在源碼走讀中具體來分析。

源碼走讀

Future

Netty 自定義的

Future

接口,繼承自 JDK 的

Future

接口,不過實際當中使用到的都是自己定義的方法。方法大緻上分為兩類:

  • 擷取結果和進行結果等待的,諸如

    sync

    await

  • 添加任務回調方法的,諸如

    addListener

    addListeners

AbstractFuture