Process.waitFor()不“等待”当前线程完成

时间:2020-10-07 08:27:29

标签: java process wait

我有一个Excel工作表,其中有要执行的jar文件列表。为了开始测试,我将运行代码以从上述excel工作表中读取并执行excel工作表中的jar文件。运行这些jar文件的代码如下:

final Process p = Runtime.getRuntime().exec("cmd /c start cmd /k java -jar " + start.jar_filepath + " " + start.tc_name + " " + start.test_data + " " + start.test_result + " " + start.test_cycle);

这实际上将同时运行所有jar文件。

我实际上希望一次执行一个jar,然后在当前jar完成执行之后再执行下一个jar。

我添加了以下内容。

p.waitFor();

但是,它的行为仍然相同,也就是说,它是同时执行的。

我错误地使用了waitFor()吗?建议是值得赞赏的。

更新: 以下是迭代Excel工作表的代码

public static void main(final String[] args) throws IOException, Throwable {
        final DataFormatter df = new DataFormatter();
        final FileInputStream StartInput = new FileInputStream("c:\\TA\\TestConfig_MA.xlsx");
        final XSSFWorkbook StartInputWB = new XSSFWorkbook(StartInput);
        final XSSFSheet sheet = StartInputWB.getSheet("Config");
        System.out.println("Amount of Row in test config : "+ sheet.getLastRowNum());
        start.count = 1;
        //while (start.count <= sheet.getLastRowNum()) {
        for(start.count = 1; start.count <= sheet.getLastRowNum(); start.count++){  
            System.out.println("Total test case = " + sheet.getLastRowNum());
            System.out.println(start.count);
            final XSSFRow row = sheet.getRow(start.count);
            start.testability = row.getCell(0).toString();            
            start.jar_filepath = row.getCell(1).toString();
            start.tc_name = row.getCell(2).toString();
            start.test_data = row.getCell(3).toString();
            start.test_result = row.getCell(4).toString();
            start.test_cycle = df.formatCellValue(row.getCell(5));
            System.out.println("test cycle from start.jar = " + start.test_cycle);
            System.out.println("Test Case Name : " + start.tc_name);
            if (start.testability.equals("Y") || start.testability.equals("y)")) {
                System.out.println("Test Case Name : " + start.tc_name);
                System.out.println("Round : " + start.count);
                final Process p = Runtime.getRuntime().exec("cmd /c start cmd /k java -jar " + start.jar_filepath + " " + start.tc_name + " " + start.test_data + " " + start.test_result + " " + start.test_cycle);
                p.waitFor();
                System.out.println("wait for = " +p.waitFor());
            else {
                System.out.println("Its a no");
            }
           // ++start.count;
        }//for
        System.out.println("test is done");
    }
   
    }

1 个答案:

答案 0 :(得分:1)

为什么需要"cmd /c start cmd /k ..."? 您运行cmd,运行start,运行cmd,运行java

尤其是start将打开一个新窗口并立即返回。因此,p.waitFor();将等待start完成,但不会等待它打开的新窗口。

您可能希望将其缩小到简单

...exec("java -jar " + ...)

或至少

...exec("cmd /c java -jar " + ...)