Netty架构 - 关于NioWorker循环的问题

时间:2012-04-17 10:38:36

标签: netty

我正在研究NioWorker.run()方法并试图了解它是如何工作的。 以下是代码的简化版本:

    for(;;) {           
      try {
        SelectorUtil.select(selector);

        if (wakenUp.get()) {
          selector.wakeup();
        }

        cancelledKeys = 0;
        processRegisterTaskQueue();
        processWriteTaskQueue();
        processSelectedKeys(selector.selectedKeys());

      } catch (Throwable t) {
      }
    }

不过很清楚它有什么作用,但我有一些问题:

1。 Selector.select(selector)执行500毫秒超时的选择。 为什么它不只是一个阻塞电话?

2. 以下片段的目的是什么?为什么我们需要执行唤醒?

    if (wakenUp.get()) {
       selector.wakeup();
    }

提前致谢

1 个答案:

答案 0 :(得分:2)

  1. 我们使用基于时间的阻塞Selector.select(..)调用,因为我们还通过processRegisterTaskQueue()方法处理向工作者注册新通道。如果我们不使用基于时间的呼叫,我们将面临降低速度的风险。我们甚至更改了Selector.select(..)调用以在最近的版本中使用10ms。

  2. 请参阅[1]

  3. 上的评论

    [1] https://github.com/netty/netty/blob/3/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java#L202