#java #multithreading #executorservice #executor
#java #многопоточность #executorservice #исполнитель
Вопрос:
Я разрабатываю средство извлечения обзоров для Play Store, используя Selenium. Мой фрагмент кода следующий:
public void extract() {
ExecutorService executor = Executors.newFixedThreadPool(this.configurationManager.getNumberOfThreadToUse());
for (String currentApp : appsToMine) {
ArrayList<String> aux = new ArrayList<>();
aux.add(currentApp);
Crawler googlePlayStoreCrawler = CrawlerFactory.getCrawler(this.configurationManager, aux, "google");
executor.execute(googlePlayStoreCrawler);
}
executor.shutdown();
}
Здесь Crawler
реализуется Runnable
. Используя больше, чем в потоке, где каждый открывает отдельный экземпляр Firefox, Selenium завершается с ошибкой, потому что веб-страница недоступна для просмотра (она скрыта новым windows, открытым другим потоком). Итак, я пытаюсь выполнить весь процесс только с 1 потоком одновременно.
Но также, если я создаю экземпляр ExecutorService
using newFixedThreadPool
с 1 в качестве параметра, новые потоки всегда запускаются, когда выполняется предыдущий.
Комментарии:
1. Завершается ли ваше приложение после одного и только одного вызова этого
extract
метода? Есть ли какая-либо дальнейшая работа в приложении или эти методы являются его единственной задачей?2.
Executors.newFixedThreadPool(1);
вернет пул потоков, содержащий только 1 поток, поэтому все задачи, отправленные в этот пул, будут выполняться последовательно. Если это не ваш случай, значит, ошибка где-то еще.
Ответ №1:
Похоже, вам вообще не нужно использовать потоки. Просто запустите программу поиска через основной поток:
for (String currentApp : appsToMine) {
ArrayList<String> aux = new ArrayList<>();
aux.add(currentApp);
Crawler googlePlayStoreCrawler = CrawlerFactory.getCrawler(this.configurationManager, aux, "google");
googlePlayStoreCrawler.run();
}