2016-10-23 2 views
1

Je suis en train de développer un extracteur de révision pour le Play Store, en utilisant Selenium. Mon morceau de code est le suivant:Exécuter 1 thread à la fois avec ExecutorService

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

Ici, Crawler implémente Runnable. En utilisant plus que sur un thread, où chacun ouvre une instance séparée de Firefox, Selenium échoue car la page web n'est pas visible (elle est cachée par une nouvelle fenêtre ouverte par un autre thread). Donc, j'essaye d'exécuter tout le processus avec seulement 1 fil à la fois.

Mais aussi si j'instancie un ExecutorService en utilisant newFixedThreadPool avec 1 comme paramètre, un nouveau thread démarre toujours lorsque le précédent est en cours d'exécution.

+0

Votre application se termine-t-elle après un et un seul appel à cette méthode 'extract'? Y at-il d'autres travaux dans l'application ou est-ce que cette méthode est son seul travail? –

+0

'Executors.newFixedThreadPool (1);' retournera un pool de threads avec seulement 1 thread, de sorte que toutes les tâches soumises à ce pool s'exécuteront séquentiellement. Si ce n'est pas le cas pour vous, il y a une erreur ailleurs. – Nikem

Répondre

2

Il semble que vous n'utilisiez pas du tout de threads. Exécutez simplement le robot d'exploration via le thread principal:

for (String currentApp : appsToMine) { 
    ArrayList<String> aux = new ArrayList<>(); 
    aux.add(currentApp); 
    Crawler googlePlayStoreCrawler = CrawlerFactory.getCrawler(this.configurationManager, aux, "google"); 
    googlePlayStoreCrawler.run(); 
}