У меня приложение на стороне сервера открывает поток сокетов для каждого подключенного клиента. У меня есть DataInputStream в каждом потоке, который вызывает read (byte [] array) для чтения данных. Я также установил время ожидания сокета на несколько минут. Основной код выглядит примерно так:
while (dataInputStream.read(array) != -1) { do something... }
Однако после нескольких часов работы в jconsole с плагином topthreads я вижу, что несколько клиентских потоков используют каждый процессор по 20% ish. Если я нажму на него, стек вызовов покажет, что поток заблокирован в приведенной выше строке в функции read ().
Я знаю, что функция read () обычно блокирует ожидание данных. При блокировке он потребляет мало циклов ЦП. Теперь он использует 20% ish каждый и мой сервер работает все медленнее, когда больше потоков имеют ту же проблему. Мой сервер получает около 5 запросов на соединение в секунду, и это происходит очень редко, поскольку в течение нескольких часов проблема возникает только у 5 потоков.
Я действительно смущен. Кто-нибудь может мне помочь?