Измените свой дизайн, чтобы иметь один поток для каждого входящего сетевого подключения.
Селектор следует использовать, когда вы используете один поток для обработки входящих сообщений на нескольких сокетах TCP.Вы регистрируете каждый сокет с помощью селектора, а затем select()
, который блокируется, пока нет данных, доступных на одном из них.Затем вы просматриваете каждый ключ и обрабатываете ожидающие данные.Это метод, который я всегда использовал при написании кода на C, и он будет работать, но я не думаю, что это лучший способ сделать это в Java.
Java имеет отличную поддержку нативных потоков, которую Cне.Я думаю, что имеет больше смысла иметь один поток на сокет TCP и вообще не использовать селекторы.Если вы просто выполните операцию чтения в сокете, поток будет блокироваться до тех пор, пока не поступят данные или сокет не будет закрыт.Это фактически то же самое, что и выбор только с одним зарегистрированным каналом.
Если вы хотите, чтобы это работало только с одним потоком, вы должны использовать селектор только для сокетов TCP, где вы хотите входящие соединения.Таким образом, единственный раз, когда вызов к select()
вернется, - это когда входящие данные ожидают на одном из сокетов.Этот поток все время будет спать, и никакая другая операция не разбудит его.