2

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

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 执行

执行在这里暂停,它没有做任何事情,我不确定后面发生了什么。我还交叉检查了批处理文件是否工作正常。

4

2 回答 2

2

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

public abstract int waitFor() throws InterruptedException

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

正如waitFor()阻塞调用一样,所有 3 个线程都卡在这一行。

注意:您不需要本质上是阻塞的Thread.sleep(5000);waitFor()

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

也代替:

while (!executor.isTerminated()) {
}

您可以使用ExecutorService#awaitTermination()

于 2013-08-05T07:39:59.303 回答
0

阅读 p.getInputStream() 和 p.getErrorStream() 并将其写入控制台而不是 thread.sleep(),您将获得线程在做什么的指示。

于 2013-08-05T07:51:14.350 回答