-1

我编写了一小段代码,它应该使用 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 应该抛出一个异常。但情况并非如此,标准输出中的时间跨度高于 100k。

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

干杯丹尼尔

4

2 回答 2

1

这并不让我感到惊讶。在您获得开始时间和结束时间之间会发生很多事情。连接可能是在截止日期之前建立的,并且您的结束时间很容易超过截止日期,具体取决于下载的速度(尤其是因为您同时进行多个下载)。

你评论说:

很抱歉,您能更详细地解释一下吗?

你有这一行:

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

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

于 2012-05-16T19:05:52.483 回答
1

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

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

超时有效 - 但线程是这里的问题。

于 2012-05-16T19:13:58.453 回答