2013-07-08 103 views
0

我一直在研究一個java類,它從文本文件中讀取大量的URL,打開一個HttpURLConnection與他們每個人,然後檢查他們的HTTP代碼,看看該網站正確連接。這個功能工作正常,問題是我在這裏處理數以十萬計的鏈接,而且這個方法太慢而無法處理所有這些。我嘗試使用線程來提高過程的效率,但無論出於何種原因,這似乎進一步降低了速度。任何可能的解決方案建議?謝謝!錯誤獲取(1000年)URL HTTP代碼

public static boolean validate(String urlStr, Proxy proxy) 
{ 
    boolean valid = false; 
    HttpURLConnection conn = null; 
    try 
    { 
     if(proxy==null)   
      conn = (HttpURLConnection)new URL(urlStr).openConnection(); 
     else 
      conn = (HttpURLConnection)new URL(urlStr).openConnection(proxy); 
     conn.setFollowRedirects(false); 
     conn.setConnectTimeout(7 * 1000); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); 
     conn.connect(); 
     final int code = conn.getResponseCode(); 
     valid = (Arrays.binarySearch(errorCodes, code) == -1); 
    } 
    catch(IOException e) 
    { 
     // Ignore this for now. Eventually we should add a logger 
    } finally { 
     if (conn != null) 
     { 
      conn.disconnect(); 
     } 
    } 
    return valid; 
} 
+0

線程並不神奇 - 它們不能解決打開數千個連接和執行I/O操作的真正問題。這可能是因爲你打開的鏈接數量有問題。你有沒有試圖淡化它(也許敲三四個數量級),看看它是否能提高性能? – Makoto

+1

如果沒有看到任何代碼,很難知道有什麼問題。我不希望那裏會有太多的代碼在這裏發佈......請編輯它到問題中。 –

+0

爲什麼不能使用java併發線程池....你可以指定池的大小。 – Hariharan

回答

0

而不是自己做連接管理,如果您使用Apache http客戶端API會更好。

Client API tutorial

和多線程使用情況的一個例子。

sample code

請注意,此代碼僅供參考,實際生產代碼應該使用集資執行人線程管理。 根據您的使用情況,您的Validate方法應該是實現Runnable或Callable接口的類的一部分。

0

我建議你看一下異步HTTP客戶端庫,如Ning