我在他们的网站上找不到答案。
你知道HtmlCleaner是否是线程安全的吗?
我有多个线程需要使用它,但我不知道我是否可以安全地重用HtmlCleaner对象的实例。
你有没有用过它?任何想法?
答案 0 :(得分:4)
现在HTMLCleaner是线程安全的,
答案 1 :(得分: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();
}
答案 2 :(得分:1)
查看源代码,没有 - 一个HtmlCleaner对象不是线程安全的。每个线程使用一个对象。
答案 3 :(得分:-1)
我的经验是否定的。我已经将HTMLCleaner用于几个应用程序,这些应用程序通常会解析数十万个URL的批处理,或者根据需要间歇性地解析。
我发现使用单个HtmlCleaner和DomSerializer在多个线程的加载下抛出异常并导致异常被抛出。
我更喜欢尽可能重用对象,它确实需要更多的代码来重复使用线程生活,但如果你关心速度和/或资源使用,正如我认为我们所做的那样,那么对象重用才有意义。
如果你的工作线程总是处于活动状态,在负载下并且没有太多,那么在没有池的线程级别重用可能对你有意义。
如果你经常创建线程(我不建议这样做),你的线程并不总是负载,有很多线程,或者可重用对象在实例化时间或者重量很重,那么重用池是有意义的运行资源消耗。
基本上,池方法允许应用程序扩展可重用对象的数量,确保在任何一个时间点只有系统需要的对象数量,处理资源释放以及是否设置了最小大小那么你可以避免与对象创建相关的任何启动延迟......到一定程度。
无论如何,我倾向于大规模工作,所以这种类型的优化可能不值得你花时间。我的理论是在有疑问时使用游泳池。