在我的程序中,我有一个n个测试脚本列表,我需要迭代列表并并行运行3个测试脚本。为了完成这个任务,我创建了一个大小为3的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 任务ID:com.selenium.test.testname1 由pool-1-thread-1
执行com.selenium.test.testname1 任务ID:com.selenium.test.testname2 由pool-1-thread-2
执行com.selenium.test.testname1 任务ID:com.selenium.test.testname3 由pool-1-thread-3
执行执行停顿在这里并没有做任何事情,我不确定背后发生了什么。我还交叉检查批处理文件是否正常工作。
答案 0 :(得分:2)
该过程需要执行长,因此您的控件不会返回。
public abstract int waitFor() throws InterruptedException
如果需要,使当前线程等待,直到此Process对象表示的进程终止。如果子进程已终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。
由于waitFor()
是一个阻塞调用,所有3个线程都停留在此行。
注意:您不需要Thread.sleep(5000);
,因为waitFor()
本身就是阻止。
尝试执行其他命令,看看控件是否返回。
而不是:
while (!executor.isTerminated()) {
}
答案 1 :(得分:0)
读取p.getInputStream()和p.getErrorStream()并将其写入控制台而不是thread.sleep(),您将获得线程正在做什么的指示。