【问题标题】:Is HtmlCleaner thread safe?HtmlCleaner 线程安全吗?
【发布时间】:2010-11-14 03:21:44
【问题描述】:

我在他们的网站上找不到答案。 你知道HtmlCleaner 是否是线程安全的吗?
我有多个线程需要使用它,但我不知道是否可以安全地重用 HtmlCleaner 对象的实例。
你用过吗?有什么想法吗?

【问题讨论】:

  • 编写线程安全的类是一项艰巨的工作。我总是认为类不是线程安全的,而作者没有在文档中明确声明。这个项目有一个论坛,我想你会在那里得到更好的答案,也许来自开发者,那里。
  • 为什么要重用它。 Java 是面向对象的,如果您需要一个类实例,请先创建一个新实例。 GC 将为您释放内存。在极少数应用程序中适用重复使用。

标签: java html xml parsing


【解决方案1】:

现在 HTMLCleaner 是线程安全的,

看例子http://htmlcleaner.sourceforge.net/javause.php

【讨论】:

    【解决方案2】:

    仅供参考,最新版本声称是:

    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();
    }
    

    【讨论】:

      【解决方案3】:

      查看源代码,不——HtmlCleaner 对象不是线程安全的。每个线程使用一个对象。

      【讨论】:

        【解决方案4】:

        我的经验是没有。我已经将 HTMLCleaner 用于几个应用程序,这些应用程序通常会解析成批的数十万个 URL,或者根据需要间歇性地解析。

        我发现使用单个 HtmlCleaner 和 DomSerializer 在多个线程的负载下引发解析异常和异常。

        我更喜欢尽可能重用对象,它确实需要更多代码才能在线程生命周期中重用,但如果您关心速度和/或资源使用,我认为我们都这样做,那么对象重用就很有意义。

        如果您的工作线程始终处于活动状态、处于负载状态并且数量不多,那么在没有池的情况下重用线程级别可能对您有意义。

        如果您不断创建线程(我不推荐这样做),您的线程并不总是处于负载状态,线程很多,或者可重用对象在实例化时间或运行资源消耗。

        基本上,池方法可以让应用程序扩大可重用对象的数量,确保您在任何时间点只拥有系统需要的对象数量,处理资源释放,以及是否设置了最小大小那么您就可以避免任何与对象创建相关的启动延迟...到一定程度。

        无论如何,我倾向于大规模工作,因此这种类型的优化可能不值得您花时间。我的理论是当有疑问时使用游泳池。

        【讨论】:

          猜你喜欢
          • 2020-04-15
          • 2011-07-04
          • 2014-04-26
          • 2012-11-30
          • 2010-12-30
          • 2013-03-12
          • 2021-08-03
          • 2010-12-27
          • 2018-06-04
          相关资源
          最近更新 更多