Я проходил через NIO Java и не смог понять, как это на самом деле помогает мне.Рассмотрим сервер, который прослушивает какой-либо порт и, когда соединение установлено, обслуживает это соединение и возвращается к socket.accept()
, ожидая нового соединения.
Теперь, если бы я написал этот сервер с использованием NIOЯ бы зарегистрировал свой ServerSocketChannel
с помощью Selector
, а затем опросил Selector
в цикле while
, чтобы узнать, произошло ли какое-либо интересующее меня событие.Если да, то я получаю Set
из SelectedKeys
и обрабатываю каждый из них.
Пока идет обработка, я не делаю selector.select()
.Поэтому, даже если произошло новое интересующее меня событие, я не буду его обслуживать!Так же, как на моем предыдущем сервере.Пока я обслуживаю запрос, я не слушаю никаких новых входящих подключений.
Не придется ли мне по-прежнему создавать новый поток каждый раз, когда selector.select()
возвращает> 0, чтобы я мог продолжать опросSelector
?Затем это становится потоком для каждого проекта подключения, что мы давно используем с любым NIO.
Чего мне не хватает?Как NIO помогает мне масштабировать?
Однопоточный сервер:
while(true) {
Socket sock = serverSocketObject.accept();
//serve this connection
}