Netty:对 Channel.writeAndFlush 的线程行为感到困惑

Netty: Confused by threading behavior of Channel.writeAndFlush

我是 Netty 的新手,我还不太了解它。这是我觉得特别令人困惑的事情。

Channel.writeAndFlush 是异步的:它应该在 I/O 操作完成之前立即 return。但是,在下面的代码中,listener("Write operation complete")中的日志语句总是在writeAndFlush("Returned from writeAndFlush")调用之后的日志语句之前执行。

好的,没关系:I/O 速度很快,并且调用了侦听器。但是,两条日志语句总是在同一个线程.

上执行

所以在我看来,当我调用 writeAndFlush 时,该线程必须等待 I/O 完成,然后它正在调用侦听器。但是,如果该方法应该是异步的,那怎么可能呢?

private static class LoggingListener implements ChannelFutureListener {
    public void operationComplete(ChannelFuture future) {
      logger.debug("Write operation complete");
    }
}

public void writeAndFlush(Object object) {
  Channel channel = getChannel();
  ChannelPromise promise = channel.newPromise();
  promise.addListener(new LoggingListener());
  channel.writeAndFlush(object, promise);
  logger.debug("Returned from writeAndFlush");
}

Channel 将所有工作分配给它的 EventLoop,它与 Thread 相关联,因此 writeAndFlush 本身将由与您的 Thread 不同的 Thread 执行如果您不是从 EventLoop 线程本身调用它,则调用线程。

如果您从 EventLoop 线程调用 writeAndFlush,它将直接被执行,并且一旦完成就会通知未来,这可能是直接的,也可能是稍后。