Почему необходимо удалить ключ в `selector.selectedKeys (). Iterator ()` в java nio?

Я нашел пример кода 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 таблицы:

  1. таблица регистрации: когда мы вызываем channel.register , в нем будет новый элемент (ключ). Только если мы вызовем key.cancel () , он будет удален из этой таблицы.

  2. готово для выбора таблицы: когда мы вызываем selector.select () , селектор будет посмотрите таблицу регистрации, найдите доступные ключи, скопируйте их ссылки в эту таблицу выбора. Элементы этой таблицы не будут очищены селектором (это означает, что даже если мы снова вызовем selector.select () , он не очистит существующие элементы)

Вот почему мы должны вызвать iter.remove () , когда мы получили ключ из таблицы выбора. Если нет, мы будем получать ключ снова и снова с помощью selector.selectedKeys () , даже если он не готов к использованию.

18
задан Neeme Praks 23 September 2014 в 06:51
поделиться