Promise 和 Future
netty中的I/O操作大部分为异步,netty在Java的Future的基础上封装了Future和Promise
Future
继承java.util.concurrent.Future接口,并且在Future基础上做了如下的强化。
future是read-only的。我们没有办法在Future中改变状态,只能获取状态。进行后续操作
1 | public interface Future<V> extends java.util.concurrent.Future<V>{ |
ChannelFuture
ChannelFuture可以通过添加ChannelFutureListener监听器,当I/O操作完成的时候来通知调用。相比于wait()方式也更推荐这种方式来获取结果状态或者执行后续操作。
此外,不建议在ChannelHandler中调用await(),因为ChannelHandler中事件驱动的方法被一个I/O线程调用,可能一直不回完成,那么await()也可能被I/O线程调用,同样会一直block,因此会产生死锁。
另外在,在Future的基础上增加了获取channle的方法
Promise
对比Future,Promise是writeable的,可以修改状态,调用noify执行Future(Promis)的listerner方法
1 | public interface Promise<V> extends Future<V> { |
DefaultPromise
在DefaultChannelPromise中会,改变状态会通知listerner
1 |
|
eg:在register过程中
AbstactServerBootstrap.initAndRegister
–>register()
–>SingleThreadEventLoop.register(channel)
–>SingleThreadEventLoop.register(new DefaultChannelPromise(channel, this))
–>AbstractUnsafe.register(promise,evenlop)–>AbstractUnsafe.resiter0(promise)–>safeSetSuccess(promise)
在safeSetSuccess调用promise.traSuccess()。notifyPromise中的listerner