Я создал 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 ......
не следует ли в любом случае удалить ключ, независимо от того, решу ли я обработать запрос или нет?