2013-08-05 2 views
1

В моей программе у меня есть список n тестовых скриптов, мне нужно перебирать список и запускать три тестовых скрипта параллельно. Для достижения этой задачи я создал Threadpool размера 3. Моя реализация как ниже для пула потоковJava runtime.exec(), выполняющий несколько процессов с использованием 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"); 

ниже моя реализация потока, где в я выполнить пакетный файл с командами Maven в нем

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

Вот что я получаю в моей консоли (я не запускается из командной строки и запустить его в фоновом режиме)

com.selenium.test.testname1 Идентификатор задачи: com.selenium.test.testname1 выполняется пул-1-нить-1

com.selenium.test.testname1 Task ID: com.selenium.test.testname2 осуществляется бассейн- 1-нить-2

com.selenium.test.testname1 идентификатор задачи: com.selenium.test.testname3 выполняется пул-1-нить 3-

выполнение пауз здесь, и это ничего не делал, я не сушу что происходит. Я также перекрестно проверил, что пакетный файл работает нормально.

+0

Сколько времени займет «Junit_runner.bat»? – Jatin

+0

Для выполнения своих заклинаний и termiante требуется от 2 до 3 минут, ее e - моя команда командного файла. ** @ Эхо от echo% 1 звонок mvn -f pom.xml test -Dtest =% 1 exit ** – Vigneshwaran

ответ

2

Процесс принимает длинный для выполнения и поэтому ваш контроль не возвращается.

public abstract int waitFor() throws InterruptedException 

Заставляет текущий поток ждать, если необходимо, до тех пор, пока процесс, представленный этим объектом процесса, не будет завершен. Этот метод немедленно возвращается, если подпроцесс уже завершен. Если подпроцесс еще не завершен, вызывающий поток будет заблокирован до завершения подпроцесса.

Поскольку waitFor() является блокирующим вызовом, все три потока застревают в этой строке.

ПРИМЕЧАНИЕ: Вам не нужно Thread.sleep(5000);, так как waitFor() сам по себе является блокирующим.

Попробуйте выполнить другую команду и посмотрите, вернется ли элемент управления.

Кроме того, вместо:

while (!executor.isTerminated()) { 
} 

Вы можете использовать ExecutorService#awaitTermination()

+0

Забудьте указать, если я убью выполнение после его блокировки, командный файл запускается для всех трех потоков. – Vigneshwaran

+0

@ user2644818 Я не понял, вы можете немного разобраться? –

+0

как я опубликовал в своем вопросе после того, как выполнение запускает три процесса и паузы в течение долгого времени, после убийства выполнения командного файла, который я вызываю из Runtime.exec (""), запускается – Vigneshwaran

0

Читать p.getInputStream() и p.getErrorStream() и записать его на консоли вместо Thread.sleep(), вы получите представление о том, что делают потоки.