Я нашел пример кода 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()
, даже если он не готов к использованию.