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

Netty:对Channel.writeAndFlush的线程行为感到困惑,netty,Netty,我对内蒂很陌生,我不会经常接触它。我发现有一点特别令人困惑 Channel.writeAndFlush是异步的:它应该在I/O操作完成之前立即返回。但是,在下面的代码中,侦听器中的log语句(“Write operation complete”)总是在调用writeAndFlush(“从writeAndFlush返回”)之后的log语句之前执行 好的,这很好:I/O很快,侦听器被调用。但是,这两条日志语句始终在同一个线程上执行 在我看来,当我调用writeAndFlush时,线程必须等待I/O完

我对内蒂很陌生,我不会经常接触它。我发现有一点特别令人困惑

Channel.writeAndFlush是异步的:它应该在I/O操作完成之前立即返回。但是,在下面的代码中,侦听器中的log语句(“Write operation complete”)总是在调用writeAndFlush(“从writeAndFlush返回”)之后的log语句之前执行

好的,这很好: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");
}

通道将所有工作分派到其
EventLoop
,该线程绑定到
线程
,因此
writeAndFlush
本身将由另一个
线程执行,如果您不是从
EventLoop
线程本身调用它,则调用线程将执行该
writeAndFlush

如果从
EventLoop
线程调用
writeAndFlush
,它将直接执行,完成后将通知未来,可能是直接执行,也可能是稍后执行