2013-08-05 3 views
1

Dans mon programme j'ai une liste de n scripts de test, j'ai besoin d'itérer la liste et d'exécuter 3 scripts de test en parallèle. Pour réaliser cette tâche, je créé un Threadpool de taille 3. Ma mise en œuvre est comme ci-dessous pour le pool de threadsJava runtime.exec() exécute plusieurs processus en utilisant Threadpool

ExecutorService executor = Executors.newFixedThreadPool(3); 
for (int threadpoolCount = 0; threadpoolCount < classNames.size(); threadpoolCount++) { 
    Runnable worker = new ProcessRunnable(classNames.get(threadpoolCount)); 
    executor.execute(worker); 
} 
executor.shutdown(); 
while (!executor.isTerminated()) { 
} 

System.out.println("Finished all threads"); 

ci-dessous est ma mise en œuvre de fil où dans i exécuter un fichier de commandes avec des commandes de Maven dans ce

public void run() { 
    try { 
     System.out.println(testname); 
     System.out.println("Task ID : " + this.testname + " performed by " + Thread.currentThread().getName()); 
     Process p = Runtime.getRuntime().exec("cmd /C Junit_runner.bat" + " " + testname); 
     p.waitFor(); 
     Thread.sleep(5000); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

Voici ce que je reçois dans ma console (je ne démarre pas l'invite de commande et en cours d'exécution en arrière-plan)

com.selenium.test.testname1 N ° de tâche: com.selenium.test.testname1 effectuée par pool-1-fil-1

com.selenium.test.testname1 ID de tâche: com.selenium.test.testname2 effectuée par piscine- 1-fil-2

com.selenium.test.testname1 ID de tâche: com.selenium.test.testname3 effectuée par pool-1-fil-3

L'exécution interrompt ici et n'a rien fait, je ne suis pas sur e ce qui se passe derrière. J'ai également vérifié que le fichier batch fonctionne correctement.

+0

Combien de temps faut-il pour lancer Junit_runner.bat? – Jatin

+0

Il prend 2 à 3 minutes pour terminer ses exécutions et termiante, son e est ma commande de fichier par lots. ** @ Écho désactivé echo% 1 appel mvn -f pom.xml test -Dtest =% 1 exit ** – Vigneshwaran

Répondre

2

Le processus prend long pour exécuter et donc votre contrôle ne revient pas.

public abstract int waitFor() throws InterruptedException 

provoque le thread courant à attendre, si nécessaire, jusqu'à ce que le processus représenté par cet objet de processus est terminé. Cette méthode retourne immédiatement si le sous-processus est déjà terminé. Si le sous-processus n'est pas encore terminé, le thread appelant sera bloqué jusqu'à la fermeture du sous-processus.

Comme waitFor() est un appel bloquant tous les 3 threads sont bloqués sur cette ligne.

REMARQUE: Vous n'avez pas besoin Thread.sleep(5000); comme waitFor() bloque dans la nature elle-même. Essayez d'exécuter une autre commande et vérifiez si le contrôle retourne.

également au lieu de:

while (!executor.isTerminated()) { 
} 

Vous pouvez utiliser ExecutorService#awaitTermination()

+0

oubliez de mentionner, si je tue l'exécution après son blocage, le fichier batch démarre pour tous les trois threads. – Vigneshwaran

+0

@ user2644818 Je n'ai pas compris, pouvez-vous élaborer un peu? –

+0

comme je l'ai posté dans ma question une fois que l'exécution commence à lancer trois processus et pauses pendant longtemps, après avoir tué l'exécution du fichier batch que j'appelle de Runtime.exec ("") commence – Vigneshwaran

0

Lire la p.getInputStream() et p.getErrorStream() et l'écrire à votre console au lieu de Thread.sleep(), vous obtiendrez une indication de ce que les threads font.

Questions connexes