Java runtime.exec()使用线程池运行多个进程

Java runtime.exec()使用线程池运行多个进程,java,maven,runtime.exec,Java,Maven,Runtime.exec,在我的程序中,我有一个n个测试脚本的列表,我需要迭代该列表并并行运行3个测试脚本。为了完成这个任务,我创建了一个大小为3的线程池。对于线程池,我的实现如下所示 ExecutorService executor=Executors.newFixedThreadPool(3); 对于(int-threadpoolCount=0;threadpoolCount

在我的程序中,我有一个n个测试脚本的列表,我需要迭代该列表并并行运行3个测试脚本。为了完成这个任务,我创建了一个大小为3的线程池。对于线程池,我的实现如下所示

ExecutorService executor=Executors.newFixedThreadPool(3);
对于(int-threadpoolCount=0;threadpoolCount
下面是我的线程实现,我在其中执行一个批处理文件,其中包含maven命令

public void run(){
试一试{
System.out.println(testname);
System.out.println(“任务ID:+this.testname+”由“+Thread.currentThread().getName()”执行);
进程p=Runtime.getRuntime().exec(“cmd/C Junit_runner.bat”+“”+testname);
p、 waitFor();
睡眠(5000);
}捕获(IOE异常){
e、 printStackTrace();
}捕捉(中断异常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 由池-1-线程-2执行

com.selenium.test.testname1 任务ID:com.selenium.test.testname3 由池-1-线程-3执行


执行暂停在这里,它什么也没做,我不知道后面发生了什么。我还交叉检查了批处理文件是否工作正常。

该过程需要很长时间才能执行,因此您的控件不会返回

public abstract int waitFor() throws InterruptedException
如有必要,使当前线程等待,直到此进程对象表示的进程终止。如果子流程已终止,则此方法立即返回。如果子进程尚未终止,调用线程将被阻塞,直到子进程退出

由于
waitFor()
是一个阻塞调用,因此所有3个线程都卡在这一行

注意:您不需要
线程睡眠(5000)
as
waitFor()
本身就是阻塞的

尝试执行其他命令,看看控件是否返回

也不是:

while (!executor.isTerminated()) {
}

您可以使用

读取p.getInputStream()和p.getErrorStream()并将其写入控制台而不是thread.sleep(),您将获得线程正在执行的操作的指示。

Junit\u runner.bat运行需要多长时间?完成其执行和Termiant需要2到3分钟,她的e是我的批处理文件命令@Echo off Echo%1 call mvn-f pom.xml test-Dtest=%1 exitforget要说的是,如果我在执行被阻止后终止执行,那么批处理文件将为所有三个线程启动。@user2644818我不明白,你能详细说明一下吗?正如我在问题中所说的,一旦执行开始启动三个进程并暂停很长时间,停止执行后我从Runtime.exec(“”)调用的批处理文件启动感谢您的输入,我不知道除了waitfor()之外要使用的wat else命令,知道吗?@Vigneshwaran我建议您在
exec()过程中启动一些其他命令,例如
cmd cd..
而不是使用正在使用的批处理文件。