Я нашел пример кода java nio:
ServerSocketChannel server = ServerSocketChannel.open();
Selector selector = Selector.open();
server.socket().bind(new InetSocketAddress(8080));
server.configureBlocking(false);
server.register(selector, SelectionKey.OP_ACCEPT);
while(true) {
selector.select();
Iterator iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = (SelectionKey) iter.next();
iter.remove(); // Why remove it?
process(key);
}
}
Когда он получает выбранные ключи, он удаляет ключ в цикле. Почему мы должны это делать?
ОБНОВЛЕНИЕ
Благодаря ответам, предоставленным EJP и user270349 , я думаю, что теперь я это понимаю, позвольте мне объяснить это подробно.
В селекторе есть 2 таблицы:
таблица регистрации: когда мы вызываем channel.register
, в нем будет новый элемент (ключ). Только если мы вызовем key.cancel ()
, он будет удален из этой таблицы.
готово для выбора таблицы: когда мы вызываем selector.select ()
, селектор будет посмотрите таблицу регистрации, найдите доступные ключи, скопируйте их ссылки в эту таблицу выбора. Элементы этой таблицы не будут очищены селектором (это означает, что даже если мы снова вызовем selector.select ()
, он не очистит существующие элементы)
Вот почему мы должны вызвать iter.remove ()
, когда мы получили ключ из таблицы выбора. Если нет, мы будем получать ключ снова и снова с помощью selector.selectedKeys ()
, даже если он не готов к использованию.