我正在研究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();
}
提前致谢
答案 0 :(得分:2)
我们使用基于时间的阻塞Selector.select(..)调用,因为我们还通过processRegisterTaskQueue()方法处理向工作者注册新通道。如果我们不使用基于时间的呼叫,我们将面临降低速度的风险。我们甚至更改了Selector.select(..)调用以在最近的版本中使用10ms。
请参阅[1]