【发布时间】: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