Это не имеет большого значения.Все, что вам нужно сделать, это установить тайм-аут для вашего соединения.
URL url = ...;
URLConnection conn = URL.openConnection();
conn.setConnectTimeout( 30000 );
conn.setReadTimeout(15000);
InputStream is = conn.openStream();
В конце концов произойдет одно из следующих событий.Ваша сеть вернется, и ваши передачи будут возобновлены, стек TCP в конечном итоге истечет время ожидания, в этом случае выдается исключение, или сокет получит исключение закрытия / сброса сокета, и вы получите IOException.Во всех случаях поток отпустит вызов read (), и ваш поток вернется в пул, готовый обслуживать другие запросы, без необходимости делать что-либо дополнительное.
Например, если ваша сеть выходит из строявы не будете получать никаких новых подключений, поэтому тот факт, что этот поток связан, не будет иметь никакого значения, потому что у вас нет входящих подключений. Так что выход из вашей сети - не проблема.
Более вероятный сценарий - сервер, с которым вы разговариваете, может застрять и прекратить отправку вам данных, что также замедлит работу ваших клиентов.Именно здесь настройка таймаутов важна для написания большего количества кода, использования NIO или отдельных потоков и т. Д. Отдельные потоки просто увеличат нагрузку на вашу машину и, в конце концов, заставят вас отказаться от потока после тайм-аута, который в точности соответствует TCPдает тебе.Вы также можете разорвать свой сервер, потому что вы создаете новый поток для каждого запроса, и если вы начнете отказываться от потоков, вы можете легко получить сотни потоков, которые сидят без дела в ожидании тайм-аута на сокете.
Если у вас большой объем трафика на вашем сервере, проходящий через этот метод, и любая задержка во времени ответа от зависимости, например от внешнего сервера, повлияет на ваше время ответа.Поэтому вам придется выяснить, сколько времени вы готовы подождать, прежде чем просто выдадите ошибку, и попросить клиента повторить попытку, потому что сервер, с которого вы читаете этот файл, не отдает его достаточно быстро.
Другие идеи заключаются в локальном кэшировании файла, попытке ограничить количество поездок по сети и т. Д., Чтобы ограничить доступ к не отвечающему пользователю.То же самое может случиться с базами данных на внешних серверах.Если ваша БД не отправляет вам ответы достаточно быстро, это может привести к сбою в пуле потоков, так же как и к файлу, который не работает достаточно быстро.Так зачем беспокоиться о файловых серверах?Дальнейшая обработка ошибок не решит вашу проблему, а просто сделает ваш код тупым.