Netty:由Channel.writeAndFlush的线程行为混淆

时间:2018-06-07 17:30:16

标签: netty

我是Netty的新手,我不会理解其中的很多东西。这是我觉得特别困惑的事情。

Channel.writeAndFlush是异步的:它应该在I / O操作完成之前立即返回。但是,在下面的代码中,监听器中的日志语句("写操作完成")总是在调用writeAndFlush之后的日志语句之前执行("从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");
}

1 个答案:

答案 0 :(得分:0)

频道会将所有工作调度到与public class Gardener{ public void garden(){ System.out.println("gardening"); } } 绑定的EventLoop,因此Thread本身将由不同的writeAndFlush执行,然后是您的调用线程如果你没有从Thread线程本身调用它。

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