Я изучаю метод NioWorker.run() и пытаюсь понять, как это работает. Ниже приведена упрощенная версия кода:Netty architecture - вопросы о петле NioWorker
for(;;) {
try {
SelectorUtil.select(selector);
if (wakenUp.get()) {
selector.wakeup();
}
cancelledKeys = 0;
processRegisterTaskQueue();
processWriteTaskQueue();
processSelectedKeys(selector.selectedKeys());
} catch (Throwable t) {
}
}
Более-менее ясно, что она делает, однако у меня есть некоторые вопросы:
1. Selector.select (селектор) выполняет выбор с 500 миллисекундный тайм-аут. Почему это не просто блокирующий вызов?
2. Какова цель нижнего фрагмента? Почему нам нужно выполнять пробуждение?
if (wakenUp.get()) {
selector.wakeup();
}
Заранее спасибо
1. Согласно моему пониманию блокировки селектора разблокируют в случае приходит новое соединение, так что вы не должны имеют временный вызов для вызова вызываемого процессаRegisterTaskQueue. 2. В комментарии в приложении обсуждается только про wakenUp.get(). Я хочу понять причину, по которой селектор должен вообще проснуться? Есть ли более чем один поток, работающий с селектором? –
Новые соединения принимаются в потоке босса с помощью отдельного селектора для селектора, используемого IO-Worker для обработки соединения. Передача из селектора босса в селектор IO-Worker обрабатывается задачами размещения босса, чтобы зарегистрировать новый канал с IO-Worker в очереди, который затем обрабатывается IO-Worker. IO-Worker нужно разбудить для обработки очереди. – johnstlr