Каково поведение селектора по умолчанию, когда набор ключей имеет размер 0? - PullRequest
1 голос
/ 13 апреля 2011

Просто интересно, каково нормальное поведение Selector в Java, когда набор ключей равен 0, поскольку это по сути бессмысленная операция (нет ключей для выбора). Может случиться так, что операция произойдет в любом случае, даже с набором ключей 0. Однако тогда возможно ли зарегистрировать ключ канала во время выбора и выполнить переоценку операции во время выбора?

Если это не так, то операция выбора без клавиш займет бесконечное количество времени? И в этом случае, что происходит с другим сетевым кодом? :) Может быть, это просто случай, когда нужно убедиться, что набор ключей не равен 0. Но я хотел бы знать, так как я написал селектор и должен убедиться, что он соответствует официальному поведению.

1 Ответ

1 голос
/ 13 апреля 2011

Класс Selector является абстрактным, и фактическая операция зависит от того, какую реализацию Selector действительно возвращает SelectorProvider.Они зависят от операционной системы.

Если реализация использует sun.nio.ch.SelectorImpl от Sun в качестве базового класса (он тоже абстрактный), то можно заметить, что методы select() синхронизируются с открытыми ключами перед вызовомабстрактный doSelect() метод.Метод register() также синхронизируется с открытыми ключами, и поэтому вполне возможно, что регистру придется ждать выбора, а выбор никогда не завершится, потому что ничего не зарегистрировано.поэтому мы не можем быть уверены.Я заметил, что документация Selector описывает, как открепить нить, застрявшую в select(), так что, вероятно, она возникает достаточно часто, чтобы ее можно было документировать, и поэтому вы вправе беспокоиться.

...