Запускать по 1 потоку за раз с помощью ExecutorService

#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();
}