netty 之 非同步處理雙子星io.netty.util.concurrent.Future與io.netty.util.concurrent.Promise
一、JDK的java.util.concurrent.Future
從這個類的註釋中,我們可以瞭解到:
Future 類就是代表了非同步計算的結果,這個介面的主要方法就是檢查計算是否已完成,等待計算,然後返回計算結果。
當計算完成後,結果只能通過get方法返回;如果有必要會堵塞直到它計算完成。
可以通過cancel方法取消。增加的方法來判斷任務是否正常完成或者被取消。一旦計算已經完成,計算不能被取消。
如果你想要使用Future 來取消,但是不提供一個可用的結果,你可以宣告Futrue 的型別,但會返回null 作為一個基本任務的結果。
FutureTask 類是Futrue類的一個實現類,實現了Runnable介面,可以被Executor 執行。
二、JDK的java.util.concurrent.FutureTask
- 一個可取消的非同步計算,這個類提供了對Future 的基本實現。有對計算的啟動和取消方法,查詢計算是否已完成,以及返回計算的結果。
- 計算的結果只有在計算已完成後才能返回,如果計算沒有完成,get方法會堵塞。一旦計算已經完成,計算不能被重啟或取消。(除非計算是被runAndReset方法呼叫)
- 可以看到這個類中有表示計算執行的狀態
private volatile int state;
private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static final int CANCELLED = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED = 6;
- 在判斷當前計算是否已完成等狀態時,都是通過這個欄位來進行判斷。
三、Netty的io.netty.util.concurrent.Future
1、說明
Netty的【io.netty.util.concurrent.Future】擴充套件了【java.util.concurrent.Future】:
- 保留jdk Future的若干阻塞行為的介面
- 同時增加了【listener型別的介面】,通過監聽器可以讓非同步執行更加有效率(當非同步執行有結果時進行回撥)
2、io.netty.util.concurrent.Future繼承體系與方法如下
四、Netty的io.netty.channel.ChannelFuture
【io.netty.channel.ChannelFuture】又擴充套件了【io.netty.util.concurrent.Future】
- 提供和一個Channel進行繫結(通過ChannelFuture的channel方法可以獲取對應的Channel物件)。
- ChannelFuture的大部分介面都是Override的io.netty.channel.ChannelFuture
- ①將型別具化成ChannelFuture
- ②將引數GenericFutureListener的範型具化成 <? extends Future<? super Void>>,其中<? super Void>表示了一種沒有返回值的非同步呼叫:
4.1 ChannelFuture的狀態
ChannelFuture有兩種狀態:未完成(uncompleted)和完成(completed).
當令Channel開始一個I/O操作時,會建立一個新的ChannelFuture去非同步完成操作.
被建立時的ChannelFuture處於uncompleted狀態(非失敗,非成功,非取消);一旦ChannelFuture完成I/O操作,ChannelFuture將處於completed狀態,結果可能有三種:
- 操作成功
- 操作失敗
- 操作被取消(I/O操作被主動終止)
需要關注ChannelFuture的其它屬性來獲取異常資訊。
下圖是 Netty API 中提供的ChannelFuture狀態遷移圖:
+---------------------------+
| Completed successfully |
+---------------------------+
+----> isDone() = true |
+--------------------------+ | | isSuccess() = true |
| Uncompleted | | +===========================+
+--------------------------+ | | Completed with failure |
| isDone() = false | | +---------------------------+
| isSuccess() = false |----+----> isDone() = true |
| isCancelled() = false | | | cause() = non-null |
| cause() = null | | +===========================+
+--------------------------+ | | Completed by cancellation |
| +---------------------------+
+----> isDone() = true |
| isCancelled() = true |
+---------------------------+
4.2 ChannelFutureListener監聽介面
ChannelFuture的get()方法獲取非同步操作的結果,但是切記一定要設定超時時間。
Netty建議通過ChannelFutureListener介面執行非同步操作結束後的回撥
示例程式碼:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ChannelFuture future = ctx.channel().close();
future.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
// Perform post-closure operation
// ...
}
});
}
另外,ChannelFuture允許新增一個或多個(移除一個或多個)ChannelFutureListener監聽介面,方法名:addListener(), addListeners(), removeListener(), removeListeners()
五、Netty的io.netty.util.concurrent.Promise
XXXX
相關文章
- Netty之非阻塞處理Netty
- netty系列之:在netty中處理CORSNettyCORS
- netty系列之:分離websocket處理器NettyWeb
- QT執行緒同步與非同步處理QT執行緒非同步
- js學習之非同步處理JS非同步
- ChannelHandler之間處理資料格式轉換與Netty自帶的ChannelhandlerNetty
- Flink處理函式實戰之五:CoProcessFunction(雙流處理)函式Function
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 直播平臺原始碼,資訊的雙端同步處理原始碼
- tidb之dm叢集同步異常處理TiDB
- Netty Protobuf處理粘包分析Netty
- ES6系列之非同步處理實戰非同步
- ES6 系列之非同步處理實戰非同步
- 非同步流程處理非同步
- 非同步處理方法非同步
- JavaScript | 非同步處理JavaScript非同步
- Netty(二):如何處理io請求?Netty
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- rocketMq之雙主雙從同步模式搭建MQ模式
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- Netty中的執行緒處理EventLoopNetty執行緒OOP
- js中非同步處理JS非同步
- Laravel 事件&非同步處理Laravel事件非同步
- 處理WKContentView雙擊crashView
- 異常處理機制(二)之異常處理與捕獲
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- Spring中使用@Async與@Transactional協調非同步與事務處理Spring非同步
- Netty事件監聽和處理(上)【有福利】Netty事件
- Netty事件監聽和處理(下)【有福利】Netty事件
- DeferredResult——非同步請求處理非同步
- MySQL主從不同步問題分析與處理思路MySql
- OpenAI草莓Q星可怕之處OpenAI
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 大資料爭論:批處理與流處理的C位之戰大資料
- 筆記:異常處理之report與render筆記
- Netty是如何處理新連線接入事件的?Netty事件