Полагаю, вам нужен тайм-аут для чтения.
Для URLConnection (если из этого вытекает InputStream) вы можете установить разные таймауты и проверить оптимальный размер блока (от отправителя).
Для сокетов такая же функциональность существует.
Тайм-аут, который можно сделать самостоятельно, используя поток: это я обнаружил на SO .
Но также Future
кажетсясоответствующий:
ExecutorService service = Executors.newFixedThreadPool(2); // Or whatever.
// Callable<String> callable = () -> extract(inputStream);
Future<String> future = service.submit(() -> extract(inputStream));
try {
String s = future.get(3, TimeUnit.SECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true);
inputStream.close();
}