2012-05-16 55 views
-1

我已經寫了一小段代碼應該下載特定網站上的文字與Jsoup(1.6.2)。Jsoup超時工作不正常

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應該拋出一個異常。但事實並非如此,在標準輸出中有超過10萬次的時間跨度。

這怎麼可能和我在做什麼錯?

乾杯 丹尼爾

回答

1

這並不讓我感到吃驚。當你獲得開始時間和結束時間之間會發生很多事情。連接可能在截止日期之前完成,並且根據下載速度有多快(特別是因爲您一次執行多個操作),您的結束時間可能會超出截止日期。

你的評論:

我很抱歉,但你能請詳細解釋一下嗎?

你有這樣一行:

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

被多個線程同時調用。想象一下,所有這些都快速連接的情況,但它們都需要時間來下載信息並進行處理,尤其是在許多線程都在爭奪相同資源的情況下。

+0

我很抱歉,但你能請詳細解釋一下嗎? –

+0

@丹尼爾:見編輯 –

1

修復thread 1執行long start = System.currentTimeMillis()和系統調度程序停止此第一個線程並啓動線程第二。第二個線程調用long start = System.currentTimeMillis()並停止第三個線程調用其代碼。

這是不確定的 - 系統調度可以指定運行compleated所有線程後的第n個線程 - 的的System.out.println可以,只要所有線程時間。

超時工作 - 但是線程是這裏的問題。