Jsoup Timeout无法正常工作

时间:2012-05-16 18:58:40

标签: java multithreading concurrency jsoup

我写了一小段代码,应该用Jsoup(1.6.2)下载给定网站的文本。

public String readPage(String url) {

    try {

        long start = System.currentTimeMillis();
        String text = Jsoup.connect(url).timeout(10000).get().html();
        System.out.println(System.currentTimeMillis() - start);
        return text;
    }
    catch (IOException e) {

        // we need to do this because the log file is flooded with useless error messages 
        if ( e.getMessage().contains("Unhandled content type") ||
             e.getMessage().contains("Premature EOF") ||
             e.getMessage().contains("Read timed out") ||
             e.getMessage().contains("403 error loading URL") ||
             e.getMessage().contains("404 error loading URL") ||
             e.getMessage().contains("405 error loading URL") ||
             e.getMessage().contains("500 error loading URL") ||
             e.getMessage().contains("503 error loading URL") ) {

            logger.debug(String.format("Error crawling website: %s", url));
        }
        else logger.error(String.format("Error crawling website: %s", url), e);
    }

    return "";
}

我在线程列表中启动此方法,每个线程负责下载单个网站。在我看来(这显然是错误的),每个system.out应该显示一个低于10000的数字,因为Jsoup应该抛出异常。但这并不是stdout中有超过100k的时间跨度的情况。

这怎么可能,我做错了什么?

干杯 丹尼尔

2 个答案:

答案 0 :(得分:1)

这并不让我感到惊讶。当你得到开始时间和结束时间之间有很多事情发生。这个连接可能是在截止日期之前完成的,你的结束时间可能很容易超出截止日期,具体取决于下载的速度(特别是因为你一次做了几次)。

您评论道:

  

对不起,请你详细解释一下吗?

你有这一行:

String text = Jsoup.connect(url).timeout(10000).get().html();

一次被多个线程调用。想象一下,所有这些都快速连接的场景,但是所有人都需要时间来下载信息并对其进行处理,特别是在许多线程都竞争同一资源的情况下。

答案 1 :(得分:1)

假设thread 1执行long start = System.currentTimeMillis()并且系统调度程序停止第一个线程并启动第2个线程。第二个线程调用long start = System.currentTimeMillis()并停止第三个线程调用其代码。

这是不确定的 - 系统调度程序可以在所有线程完成后分配运行第n个线程 - System.out.println可以与所有线程持续时间一样长。

超时有效 - 但线程就是问题所在。

相关问题