来自netty.io的netty示例的代码片段似乎有错误

时间:2016-04-19 07:00:03

标签: netty rx-netty

代码段是:

        final ChannelFuture f = ctx.writeAndFlush(time); 
        f.addListener(new ChannelFutureListener() {

            public void operationComplete(ChannelFuture future) {
                assert f == future;
                ctx.close();
            }
        }); 

如果'会发生什么? final ChannelFuture f = ctx.writeAndFlush(time); '执行速度非常快,以便下一个addListener代码尚未启动。 当第一行代码完成时,线程会通知所有侦听器操作已完成,但此时根本没有侦听器! 之后,添加了一个新的侦听器,但不会再收到通知!

代码来源:http://netty.io/wiki/user-guide-for-5.x.html

1 个答案:

答案 0 :(得分:2)

ChannelFuture保留其完成状态,因此如果在完成后添加了一个监听器,那么"迟到"添加的侦听器会在添加时立即回叫。

请参阅ChannelFuture.addListener(GenericFutureListener)的javadoc,特别是注释:

  

如果此未来已完成,则指定的侦听器为   立即通知。

查看DefaultPromise的impl。迟侦听器(即未来完成时添加的侦听器)具有自己的处理程序(notifyLateListener)。