我在我的一個Web項目中使用HtmlUnit來屏蔽一些代碼。我想知道我需要在多大程度上同步代碼。目前,我正在同步所有使用WebClient對象檢索頁面的代碼(即webClient.getPage(url))。我假設,如果webClient.getPage()不同步,那麼'瀏覽器'可能會嘗試一次加載多個頁面(糾正我,如果我錯了)。爲了解決這個問題,我可能不得不打開多個窗口,對嗎?HtmlUnit同步問題
我的問題是關於HtmlPage,HTMLTABLE等類。在檢索HtmlPage對象之後,是否需要同步從HtmlPage對象(即HtmlTable)返回的該頁面和其他對象的讀取內容,或者將整個頁面緩存到內存中?我假設它沒有被緩存,那麼如果WebClient在我操縱先前返回的HtmlPage對象時再次調用getPage(),則可能發生不好的事情。
我想有已同步控制到將返回HtmlPage,然後操縱頁面,而無需擔心同步Web客戶端調用方法Connection類。這有什麼問題嗎?
實施例:
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...
}
}
編輯:我知道Web客戶端不是線程安全,因此MyConnection的對象方法getHtmlPage()在我的例子是同步的。
您是否使用多個線程,每個線程使用相同的WebClient實例? – 2012-02-14 17:56:43
那麼爲什麼'synchronized'會有用呢? 'synchronized'用於防止多個線程並行執行相同的代碼塊。你只有一個線程。 – 2012-02-14 18:22:14
我的錯誤。這是一個Web應用程序,所以是的,它將是多線程的。 MyConnection對象可以同時調用。 – acvcu 2012-02-14 18:53:09