Я использую HtmlUnit в одном из своих веб-проектов для скрининга кода.Мне интересно, в какой степени мне нужно синхронизировать код.В настоящее время я синхронизирую весь код, где я использую объект WebClient для извлечения страниц (т.е. webClient.getPage (url)).Я предполагаю, что если webClient.getPage () не синхронизирован, то «браузер» может попытаться загрузить несколько страниц одновременно (поправьте меня, если я ошибаюсь).Чтобы обойти это, мне, вероятно, придется открыть несколько окон, правильно?
Мой вопрос касается классов HtmlPage, HtmlTable и т. Д.После получения объекта HtmlPage нужно ли синхронизировать чтение этой страницы и других объектов, возвращаемых из объекта HtmlPage (т. Е. HtmlTable), или вся страница кэшируется в памяти?Я предполагаю, что если он не кэшируется, то, если WebClient снова вызывает getPage (), пока я манипулирую ранее возвращенным объектом HtmlPage, могут произойти плохие вещи.
Я хотел бы иметь класс 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 () в моем примере синхронизирован.