【问题标题】:Howto make a function "timeoutable" in Java?如何在 Java 中使函数“超时”?
【发布时间】:2009-10-09 15:43:17
【问题描述】:
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 秒,那么中止此功能的最简单方法是什么?

提前致谢!

【问题讨论】:

  • +1 用于“超时”

标签: java timeout


【解决方案1】:

如果您在网络连接上启用连接和读取超时,那么对于您来说可能就足够了(尽管不能完全满足您的要求),例如:

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

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

【讨论】:

    【解决方案2】:

    您可以从另一个线程关闭流。

    【讨论】:

      【解决方案3】:

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

      TimeLimiter:

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

      【讨论】:

        【解决方案4】:

        看看FutureTask...

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 通常 I/O 不会像那样被中断。 Solaris 上的某些版本的 Sun JRE 曾经这样做,但我不知道有其他版本默认启用它。
          猜你喜欢
          • 1970-01-01
          • 2023-03-23
          • 2019-08-09
          • 2022-01-17
          • 2015-10-31
          • 1970-01-01
          • 2019-03-28
          • 2017-03-25
          • 2021-07-29
          相关资源
          最近更新 更多