У меня сложная петля, обрабатывающая несколько разных каналов NIO и другие объекты. Некоторые из этих объектов запускают их обработку (то есть имитируют «select» -event), вызывая Selector. wakeup().Selector.select() не заполняет selectedKeys(), если вызывается функция wakeup() перед select()
Когда я случайно положил мою нить в занятую петлю, всегда вызывая пробуждения() перед каждым вызовом select(), я заметил, что мои другой NIO каналов больше не получать обслуживание на всех. Как только условие, вызвавшее цикл занятости, исчезло, все остальные каналы были немедленно восстановлены, как обычно.
После немного возиться с этим я разобрался, что причина моих других каналов больше не обслуживаемые было то, что выберите() не заполнили список selectedKeys(), если он немедленно возвращается из-за ожидаемого wakeup().
Ожидается ли такое поведение? Я не мог найти ничего в документации относительно этой детали.
Если да, то есть способ предотвратить это более элегантно, чем после каждого выберите() с дополнительным selectNow()?
Является ли это документированным где-то? Я предполагал, что wakeup(); Выбрать(); будет эквивалентно selectNow(); –
Правильно ли я предполагаю, что wakeup(); selectNow(); то также не заполняет выбранные ключи? –