2009-07-26 102 views
2

我在他們的網站上找不到答案。 你知道HtmlCleaner是否線程安全?
我有多個線程需要使用它,但我不知道是否可以安全地重用HtmlCleaner對象的實例。
你有沒有使用它?任何想法?HtmlCleaner線程安全嗎?

+0

編寫線程安全類是一個艱苦的工作。我總是認爲類不是線程安全的,而作者沒有在文檔中聲明明確性。這個項目有一個論壇,我想你會在那裏得到一個更好的答案,可能來自開發者,那裏。 – PeterMmm 2009-07-26 12:25:34

回答

1

查看源代碼,no - HtmlCleaner對象不是線程安全的。每個線程使用一個對象。

-1

我的經驗是否定的。我已經爲幾個應用程序使用HTMLCleaner,這些應用程序可以定期分析數十萬個URL的批次,或者根據需要間歇性地解析。

我發現解析異常和使用單個HtmlCleaner和DomSerializer在多線程加載時拋出的異常。

我希望儘可能重用對象,但它確實需要更多的代碼才能在線程生命中重用,但如果您關心速度和/或資源使用情況,我認爲我們都這樣做,那麼對象重用就很有意義。

如果您的工作線程始終處於活動狀態,負載不足且沒有太多,則在沒有池的線程級別重用可能對您有意義。

如果您不斷創建線程(我不建議這樣做),那麼您的線程並不總是處於加載狀態,線程數很多,或者可重用對象在實例化時間或運行資源消耗。

基本上,池方法可以讓應用程序擴大可重用對象的數量,確保您只有系統需要的對象數量在任何時間點都足夠,處理資源釋放,並且如果最小尺寸是設置,那麼你可以避免任何與創建對象相關的啓動滯後...到一個點。

無論如何,我傾向於大規模工作,所以這種類型的優化可能不值得你花時間。我的理論是在懷疑使用游泳池的時候。

3

僅供參考,其最新版本聲稱是:

http://htmlcleaner.sourceforge.net/javause.php#example2

final CleanerProperties props = new CleanerProperties(); 
final HtmlCleaner htmlCleaner = new HtmlCleaner(props); 
final SimpleHtmlSerializer htmlSerializer = 
    new SimpleHtmlSerializer(props); 

// make 10 threads using the same cleaner and the same serializer 
for (int i = 1; i <= 10; i++) { 
    final String url = "http://search.eim.ebay.eu/Art/2-1/?en=100&ep=" + i; 
    final String fileName = "c:/temp/ebay_art" + i + ".xml"; 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       TagNode tagNode = htmlCleaner.clean(new URL(url)); 
       htmlSerializer.writeToFile(tagNode, fileName, "utf-8"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
}