netty ChannelFuture

在Netty中所有的io操作都是异步的,这也就是意味任何io访问,那么就立即返回处理,并且不能确保
返回的数据全部完成。因此就出现了channelFuture,channelFuture在传输数据时候包括数据和状态两个
部分。他只有Uncompleted和Completed, 既然netty io是异步的,那么如何知道channel传送完成有两种方式,一种添加监听器addListener(ChannelFutureListener) 还有一种直接调用await()方法,这两种方式有下面的区别:

监听器:
是以事件模式的,因此代码就需要用事件模式的样式去写,相当复杂,但他是non-blocking模式的性能方面要比await方法好,而且不会产生死锁情况
wait():
直接方法调用,使用简单,但是他是blocking模式,性能方面要弱而且会产生死锁情况
 
不要在ChannelHandler 里面调用await(),这是因为通常在channelHandler里的event method是被i/o线程调用的(除非ChannelPipeline里面有个ExecutionHandler),那么如果这个时候用await就容易产生死锁。


io write() 之后并不直接写数据, 而是将数据写入一个队列, 然后返回. 由worker线程取出, 执行写操作, 成功后发送事件, 也就调用了你的那个 Listener,所以doSomething() 也是在worker线程执行的.



猜你喜欢

转载自san-yun.iteye.com/blog/1693598