Netty是一個異步網絡處理框架,在實現中大量使用了Future機制,并在Java自帶Future的基礎上,增加了Promise機制。這兩者的目的都是使異步編程更加方便使用。在閱讀源碼之前,我們需要對Future的機制有很清楚的認識。
## 4.1 異步編程模型
### 4.1.1 Future
使用Future機制時,我們調用耗時任務會立刻返回一個Future實例,使用該實例能夠以阻塞的方式或者在未來某刻獲得耗時任務的執行結果,還可以添加監聽事件設置后續程序。
```
function Future asynchronousFunction(String arg){
Future future = new Future(new Callable(){
public Object call(){
return null;
}
});
return future;
}
ReturnHandler handler = asynchronousFunction(); // 耗時函數,但會立即返回一個句柄
handler.getResult(); // 通過句柄可以等待結果
handler.addListener(); //通過句柄可以添加完成后執行的事件
handler.cancel(); // 通過句柄取消耗時任務
```
### 4.1.2 Promise
在Future機制中,業務邏輯所在任務執行的狀態(成功或失敗)是在Future中實現的,而在Promise中,可以在業務邏輯控制任務的執行結果,相比Future,更加靈活。
```
// 異步的耗時任務接收一個promise
function Promise asynchronousFunction(String arg){
Promise promise = new PromiseImpl();
Object result = null;
result = search() //業務邏輯,
if(success){
promise.setSuccess(result); // 通知promise當前異步任務成功了,并傳入結果
}else if(failed){
promise.setFailure(reason); //// 通知promise當前異步任務失敗了
}else if(error){
promise.setFailure(error); //// 通知promise當前異步任務發生了異常
}
}
// 調用異步的耗時任務
Promise promise = asynchronousFunction(promise) ;//會立即返回promise
//添加成功處理/失敗處理/異常處理等事件
promise.addListener();// 例如,可以添加成功后執行的事件
doOtherThings() ; // 繼續做其他事件,不需要理會asynchronousFunction何時結束
```
在Netty中,Promise繼承了Future,包含了這兩者的功能。