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

来自netty.io的netty示例的代码片段似乎有bug,netty,rx-netty,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); 
        f.addListener(new ChannelFutureListener() {

            public void operationComplete(ChannelFuture future) {
                assert f == future;
                ctx.close();
            }
        }); 
如果'final ChannelFuture f=ctx.writeAndFlush(time);'执行速度非常快,因此下一个
addListener
代码尚未启动。 当第一行代码完成时,线程通知所有侦听器操作已完成,但此时根本没有侦听器! 之后,会添加一个新的侦听器,但不会再收到任何通知


代码源:

ChannelFuture保留其完成状态,因此如果在完成后添加了侦听器,则添加时会立即回调“延迟”添加的侦听器

有关注释,请参见javadoc:

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


有关详细信息,请参阅impl。延迟侦听器(即,在未来完成后添加的侦听器)有自己的处理程序(notifyLateListener)。

ChannelFuture保留其完成状态,因此如果在完成后添加了侦听器,则添加后会立即调用“延迟”添加的侦听器

有关注释,请参见javadoc:

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


有关详细信息,请参阅impl。延迟侦听器(即,在未来完成后添加的侦听器)有自己的处理程序(notifyLateListener)。

如果用户忘记添加至少一个侦听器,是否会导致OutOfMemoryError?一旦无法访问未来,则会对其进行垃圾收集,并且状态相当小,因此,我想说,除非你千方百计将期货藏在收藏品或类似物品中,否则不太可能有OOM。然而,这个解释仍然无法说服我。你查阅了源代码了吗?ChannelFuture不知道何时会添加侦听器,也不知道何时应该发布用于gc目的的未来结果,因为根据您的解释,它将等待侦听器。非常感谢您的回复。嗯,更新后的答案似乎更好。根据你的回答,未来会保持它的“完成状态”,但它会持续多久?它不会像你一样持续;)只要对象是可访问的,它就会持续。如果用户忘记添加至少一个侦听器,这是否会导致OutOfMemoryError?一旦无法访问未来,它就会被垃圾收集,并且状态相当小,因此我想说,除非您特意将未来存储在集合或类似的内容中,否则不太可能出现OOM。但是,这个解释还是无法说服我。你查阅了源代码了吗?ChannelFuture不知道何时会添加侦听器,也不知道何时应该发布用于gc目的的未来结果,因为根据您的解释,它将等待侦听器。非常感谢您的回复。嗯,更新后的答案似乎更好。根据你的回答,未来会保持它的“完成状态”,但它会持续多久?它不会像你一样持续;)只要对象是可访问的,它就会持续。