如何在Java中使函数“超时”?

时间:2009-10-09 15:43:18

标签: java timeout

private String indexPage(URL currentPage) throws IOException {
    String content = "";
    is = currentPage.openStream();
    content = new Scanner( is ).useDelimiter( "\\Z" ).next();
    return content;
}

这是我目前正在抓取网页的功能。问题所在的功能:

content = new Scanner( is ).useDelimiter( "\\Z" ).next();

如果网页没有回答或需要很长时间才能回答,我的主题就会挂在上面一行。如果加载完全加载该流需要的时间超过5秒,那么中止此功能的最简单方法是什么?

提前致谢!

5 个答案:

答案 0 :(得分:7)

如果您在网络连接上启用连接和读取超时,而不是单独使用单独的观察程序线程,则可能就足够了(尽管不能完全满足您的要求),例如:

URL url = new URL("...");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);
InputStream is = conn.getInputStream();

如果连接到服务器的时间超过5秒(5000毫秒),或者您必须在实际读取的任何内容块之间等待超过10秒(10000毫秒),则此示例将失败。但是,它不会限制您检索页面所需的时间。

答案 1 :(得分:3)

您可以从其他线程关闭流。

答案 2 :(得分:3)

Google最近发布的guava-libraries有一些提供类似功能的课程:

TimeLimiter

  

生成对代理对象的方法调用施加时间限制的代理。例如,要返回target.someMethod()的值,但是如果此方法调用超过50毫秒,则替换DEFAULT_VALUE,您可以使用此代码...

答案 3 :(得分:1)

查看FutureTask ...

答案 4 :(得分:0)

尝试中断线程; Java中的许多阻塞调用将在收到中断时继续。

在这种情况下,content应为空,Thread.isInterrupted()应为true