У меня есть Java-программа, которая порождает 4 потока.В каждом потоке у меня есть несколько тайм-аутов сокетов.Однако кажется, что эти тайм-ауты не соблюдаются, т.е. функция readLine()
может блокироваться на более длительный период времени.
Мне нужно следующее поведение: если я установлю тайм-аут сокета на 300 мс, то я хочу, чтобы функция readLine()
возвращалась в течение 300 мс с момента вызова readLine()
(то есть основного вызова select), не важно что.Я понимаю, что планировщик ОС будет переводить потоки в спящий режим при совместном использовании процессора, но есть ли в Java какой-либо способ заставить потоки всегда просыпаться, чтобы обеспечить такое поведение?Или это просто неправильный способ думать при многопоточном программировании?
В идеале, поскольку я порождаю 4 потока и работаю на 6-ядерном компьютере, каждый поток должен иметь возможность получать свой собственный ЦП и работать параллельно, и уважать время ожидания выбора ... но это возможнослишком много, чтобы ожидать ...
PS: я действительно использую Thread.interrupt (), чтобы гарантировать, что каждый из моих потоков завершится в течение определенного времени (я проверяю время, прошедшее в главном потоке, и прерываюдочерние темы, если это было слишком долго).В каждом из моих потоков я подключаюсь к (разному) серверу, делаю запрос и жду ответа.Я не знаю, как долго ответ будет.Поэтому я продолжаю вызывать метод readLine()
, пока не истечет время ожидания SocketTimeoutException
.Я устанавливаю тайм-аут в 300 мс, так как ожидаю, что сервер начнет отвечать в течение этого времени.Причина, по которой я хочу применить этот тайм-аут, заключается в том, что сервер ведет себя широковещательно и отправляет ответы на запрос от одного клиента всем клиентам.Поэтому, если у меня нет тайм-аута, я буду продолжать получать данные в ответ на запросы некоторых других клиентов.