根据this answer,方法HttpURLConnection.setReadTimeout()
允许您设置等待服务器从输入流中读取数据的最大时间 - 如Oracle所述:
如果读取超时在数据可用于读取之前到期,则在从返回的输入流读取时可以抛出SocketTimeoutException。
它不允许您设置超时以强制服务器在特定时间内完成读取数据
我的问题是:
有没有办法设置超时以强制服务器在指定的时间内完成读取数据,或者这根本不可能?
谢谢
根据您的要求,您不能在timeout
上设置HttpURLConnection
。
但是,您可以使用单独的Thread
来缓解这种情况。
得到一个ExecutoreService
final ExecutorService executor = Executors.newSingleThreadExecutor();
提交你的Callable<T>
任务,其中T
是你从HttpURLConnection
数据流中读取后将返回的数据类型。
final Future<T> result = executor.submit(new HttpTask());
你会得到一个Future<T>
,代表你的任务结果。
现在,使用Future#get(long timeout, TimeUnit unit)
方法。
try {
final T value = result.get(10, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
result.cancel(true);
}
在这种情况下,如果超过10秒,将抛出TimeoutException
,你将能够突然结束你的任务。