Netty中的操作,如bind、Connect、Write,會返回一個ChannelFuture。
調用者並不能立刻獲得結果,而是通過Future-Listener機制,用戶可以主動獲取或等待通知機制獲取IO操作結果。
Netty的異步模型建立在Future和Callback之上的。
假設有個方法func,計算非常耗時,等待顯然不合適。那麼可以在調用func時,返回一個Future對象,後續可以通過Future監控func的處理過程。
Future說明
- 表示異步執行的結果,可以使用它所提供的方法檢測執行是否完成
- ChannelFuture是一個接口,可以添加監聽器,當監聽的事件完成時,就會通知到監聽器。
ChannelFuture cf = bootstrap.bind(6666).sync();
// 添加Listener
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()){
System.out.println("綁定完成");
}else{
System.out.println("綁定失敗");
}
}
});
監聽事件完成,就會執行operationComplete,可以通過isSuccess、isCancelled、isDone等來判斷執行結果。
相比傳統的阻塞IO,執行IO操作就會阻塞在這裏,直到完成。
異步的優點就是不會阻塞,線程在IO期間可以做些其他事情。在高併發的情況下會更穩點和更高的吞吐量。