Я не знаком с Java Nio. Я попытался написать небольшое демо, как это:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(9999)).configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
for (; ; ) {
int select = selector.select(2_000);
if (select == 0) {
System.out.println("no event");
continue;
}
System.out.println("select = " + select);
}
Время ожидания установлено на 2 секунды, и программа выводит сообщение «нет события» каждые 2 секунды.
Но когда я попытался связаться с ним по телнету, он начал очень быстро печатать «нет событий». Похоже, что метод select возвращает значение 0 без блокировки.
Почему? Это первый вопрос.
И когда я попытался добавить несколько логик для цикла вроде этого:
for (; ; ) {
int select = selector.select();
if (select == 0) {
System.out.println("no event");
continue;
}
System.out.println("select = " + select);
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
System.out.println("iterator = " + iterator.hasNext());
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
}
}
Затем я снова запускаю его, метод select возвращает 1.
Почему? Это второй вопрос.
Первый раз задавайте вопросы здесь. Пожалуйста, прости мой плохой английский.