Iterator.remove (), вызываемый для удаления SelectionKey, не работает - PullRequest
0 голосов
/ 05 мая 2020

Я создал ServerSocketChannel, который регистрирует Selector с интересом OP_ACCEPT, запрос приходит в триггер accept (), а затем я удаляю SelectionKey (поскольку он был обработан) из набора, возвращаемого Selector.selectedKeys (), все сработало хорошо, однако, после того, как я прокомментировал строку ServerSocketChannel.accept (), while (Iterator.hasNext ()) l oop становится бесконечным (это означает, что hasNext () возвращает true, все же):

while(true){
  if(Thread.currentThread().isInterrupted())break;
  int n = sel.select(); //blocks until request comes in

  Iterator<SelectionKey> it = sel.selectedKeys().iterator();

  while(it.hasNext()){ //always returns true if the "sever.accept()" line is commented
    SelectionKey key = it.next();
    if(key.isAcceptable()){
      log("request comes in");
      ServerSocketChannel server = (ServerSocketChannel)key.channel();
      // server.accept();  //and yet this while() block goes infinite
    }

  log(sel.selectedKeys().size()); //prints 1, for testing purpose I registered one ServerSocketChannel to Selector
  it.remove();
  log(sel.selectedKeys().size()); //prints 0
}

вывод журнала: запрос приходит 1 0 запрос приходит 1 0 запрос приходит 1 0 ......

не следует ли в любом случае удалить ключ, независимо от того, решу ли я обработать запрос или нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...