1

我正在研究 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();
    }

提前致谢

4

1 回答 1

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

  2. 请参阅 [1] 处的评论

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

于 2012-04-17T19:12:55.067 回答