【问题标题】:HtmlUnit Synchronization QuestionsHtmlUnit 同步问题
【发布时间】:2012-02-14 13:50:34
【问题描述】:

我在我的一个 Web 项目中使用 HtmlUnit 来筛选一些代码。我想知道我需要在多大程度上同步代码。目前,我正在同步使用 WebClient 对象检索页面的所有代码(即 webClient.getPage(url))。我假设如果 webClient.getPage() 不同步,那么“浏览器”可能会尝试一次加载多个页面(如果我错了,请纠正我)。为了解决这个问题,我可能必须打开多个窗口,对吗?

我的问题是关于 HtmlPage、HtmlTable 等类。检索到 HtmlPage 对象后,是否需要同步读取该页面和从 HtmlPage 对象(即 HtmlTable)返回的其他对象,还是将整个页面缓存到内存中?我假设如果它没有被缓存,那么如果 WebClient 在我操作之前返回的 HtmlPage 对象时再次调用 getPage(),那么可能会发生不好的事情。

我想要一个 Connection 类,它具有控制对 WebClient 的调用的同步方法,该调用将返回一个 HtmlPage,然后操作页面而不必担心同步。这有什么问题吗?

例子:

public MyConnection {
    private final WebClient webClient;        

    public MyConnection() {
    this.webClient = new WebClient();
    this.webClient.setTimeout(10 * 1000);
    this.webClient.setJavaScriptEnabled(false);
    this.webClient.setCssEnabled(false);
}

    public synchronized HtmlPage getHtmlPage(String url) {
        return webClient.getPage(url);
    }
}



public UseConnectionClass {
    private MyConnection conn;

    public void getAPage(String url) {
        return conn.getPage(url);
    }        
}

public ClientClass {
    public void doSomething() {
         UseConnectionClass useConn = new UseConnectionClass();
         HtmlPage page1 = useConn.getAPage("http://foobar1.com/");
         HtmlPage page2 = useConn.getAPage("http://foobar2.com/");
         // do something with page1...
         // do something with page2...

        page1.getElementsByTagName("table");
        page2.getElementsByTagName("table");

        // etc...

    }
}

编辑:我知道 WebClient 不是线程安全的,因此我的示例中的 MyConnection 对象方法 getHtmlPage() 是同步的。

【问题讨论】:

  • 您是否使用多个线程,每个线程都使用相同的 WebClient 实例?
  • 那为什么synchronized 会有用呢? synchronized 用于防止多个线程并行执行同一个代码块。你只有一个线程。
  • 我的错误。它是一个 Web 应用程序,所以是的,它将是多线程的。 MyConnection 对象可以同时被调用。

标签: java synchronization htmlunit


【解决方案1】:

正如the javadoc 所说:

WebClient 实例不是线程安全的。它旨在用于 来自一个线程。

每个线程都应该有自己的 WebClient。

【讨论】:

  • 我已经从文档中知道了这一点。我在询问通过调用 WebClient 检索到的对象。当我通过调用 webClient.getPage() 方法返回 HtmlPage 时,HtmlPage 线程是否安全,或者任何处理 HtmlPage 对象的方法也需要同步?
  • 鉴于页面链接到用于获取它的 WebClient,我也会从单个线程中使用它:与其 WebCLient 所属的线程相同的线程。
  • 所以看起来任何以某种方式链接到 WebClient 的对象都需要在同步方法中,包括 HtmlTables 等。
  • 没有。看来您不应该在线程之间共享它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2011-07-15
相关资源
最近更新 更多