2016-04-19 5 views
0

を持っているようだ。何が起こるコードスニペットは、コードスニペットがあるバグ

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

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

"であれば、最終的なChannelFutureのF = ctx.writeAndFlush(時間); 'は次のaddListenerコードがまだ開始しないように非常に高速に実行されます。 最初のコード行が完了すると、スレッドはすべてのリスナーに操作が完了したことを通知しますが、その時点ではリスナーはまったくありません。 その後、新しいリスナーが追加されますが、これ以上の通知は受信されません。

コードソース:http://netty.io/wiki/user-guide-for-5.x.html

答えて

2

ChannelFutureは、リスナーが完了した後に追加された場合、「後半」を追加リスナーが追加にすぐに戻って呼ばれているように、その完了状態を保持します。この将来がすでに完了している場合は、指定されたリスナーが すぐに通知され

は、ChannelFuture.addListener(GenericFutureListener)のために特別にコメントをJavadocを参照してください。

DefaultPromiseのimplを参照してください。最近のリスナー(未来が完成したら追加されたリスナー)には、独自のハンドラー(notifyLateListener)があります。

+0

ユーザーが少なくとも1つのリスナーを追加するのを忘れた場合、OutOfMemoryErrorが発生しますか? –

+0

未来はガーベージ・コレクションが不可能で、状態はかなり小さいので、コレクションなどで先物を隠すことをやめない限り、OOMは起こりそうもないと言います。 – Nicholas

+0

しかし、この説明はまだ何とか私を納得させることができませんでした。あなたはソースコードを参考にしましたか? ChannelFutureはリスナーがいつ追加されるかを知らず、あなたの説明に従ってリスナーを待っているので、gc目的のために将来の結果をいつリリースするべきかも知らない。 –

関連する問題