2017-02-01 9 views
-1

У меня сложная петля, обрабатывающая несколько разных каналов NIO и другие объекты. Некоторые из этих объектов запускают их обработку (то есть имитируют «select» -event), вызывая Selector. wakeup().Selector.select() не заполняет selectedKeys(), если вызывается функция wakeup() перед select()

Когда я случайно положил мою нить в занятую петлю, всегда вызывая пробуждения() перед каждым вызовом select(), я заметил, что мои другой NIO каналов больше не получать обслуживание на всех. Как только условие, вызвавшее цикл занятости, исчезло, все остальные каналы были немедленно восстановлены, как обычно.

После немного возиться с этим я разобрался, что причина моих других каналов больше не обслуживаемые было то, что выберите() не заполнили список selectedKeys(), если он немедленно возвращается из-за ожидаемого wakeup().

Ожидается ли такое поведение? Я не мог найти ничего в документации относительно этой детали.
Если да, то есть способ предотвратить это более элегантно, чем после каждого выберите() с дополнительным selectNow()?

ответ

0

Конечно, ожидается. Он немедленно перенастроен из-за пробуждения, поэтому он не блокировал поиск готовых каналов, заполнял выбранные ключи и т. Д.

+0

Является ли это документированным где-то? Я предполагал, что wakeup(); Выбрать(); будет эквивалентно selectNow(); –

+0

Правильно ли я предполагаю, что wakeup(); selectNow(); то также не заполняет выбранные ключи? –

 Смежные вопросы

  • Нет связанных вопросов^_^