Обновление
Я уже использую FixedThreadPool
. Что происходит, так это то, что каждый поток открывает одно соединение для одного сайта. Я хочу сделать что-то асинхронное.
- Отправить запрос на сервер
- Переходите к следующему запросу без необходимости ждать завершения первого запроса
- Когда запрос был установлен, сделайте что-нибудь, сообщив другому потоку, что соединение установлено и готово к загрузке.
Я думаю, что это ускорит выполнение, потому что будет использовать меньше потоков для открытия того же или большего количества соединений, что и текущая производительность.
В текущем способе каждый поток ожидает время без работы в ожидании установления соединения. Таким образом, он всегда будет работать.
Вопрос
Я хочу знать, есть ли способ открыть соединение с несколькими сайтами только с одним потоком.
Это потому, что я делаю веб-сканер, я уже создал поток, чтобы открыть соединение, но после определенного количества потоков это не поможет, потому что совместное использование процессора значительно увеличится.
Я хочу, чтобы это ускорило количество загруженных страниц. Возможно ли это сделать? Как?
Этот код открывает соединение и выполняет некоторую обработку. Он выполняется потоками, которые открывают соединение
/*
* Open connection to a server
*/
boolean openConnection(Link link) throws Exception {
//set the connection paramenters
HttpURLConnection conn = (HttpURLConnection) new URL(link.getOriginalURL().getURL()).openConnection();
conn.setRequestProperty("User-Agent", ROBOT_NAME);
conn.setInstanceFollowRedirects(true);
conn.setConnectTimeout(READ_TIMEOUT);
conn.setReadTimeout(READ_TIMEOUT);
link.setConnection(conn);
//open the connection
conn.connect();
//check the server answer
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
return false;
}
//analyse the URL of the redirected URL
urlAnalyzer.fillURL(link.getRedirectedURL(), getRedirectedURL(link.getConnection()));
return true;
}
Выполняет открытие соединений, каждое в одном потоке
/*
* Start the execution of the connection openers
*/
private void executeConnectionOpeners() {
LOGGER.info("Starting connection openners.");
/* Execution */
NameThreadFactory ntf = new NameThreadFactory("Connection Opener");
crawlerOpenerExecutor = Executors.newFixedThreadPool(nOpeners, ntf);
for (int i = 0; i < nOpeners; i++) {
crawlerOpenerExecutor.submit(new ConnectionOpener(this));
}
/* End of execution */
LOGGER.info(nOpeners + " connection openers created and running.");
}