p.waitFor()不等待进程完成(Java)

时间:2013-12-14 16:47:35

标签: java process

这是该线程的衍生产品:Killing a JFrame/Java when process finishes

我知道这个问题在这里被问了很多次,但没有一个答案似乎能解决我的问题。我遇到的问题是:我有一个调用批处理文件的java程序。我需要在Java程序继续之前完成批处理文件。为此,我使用waitFor()方法,该方法应该等到进程完成。但事实并非如此。我找到了这个线程,这表明进程waitFor()实际上正在等待的只是cmd.exe,它在实际进程之前返回。 Runtime.exec().waitFor() doesn't wait until process is done 该线程建议使用/ wait命令,但是当我这样做时没有任何区别。我的代码非常深入,几个类都相互依赖,但这是一个尝试过的SSCCE:

public class BatchFileRun(){
    public static void main(String[] args){
        ArrayList<String> list = new ArrayList<String>();
        list.add("cmd.exe");
        list.add("/C");
        list.add("Start");
        list.add("/wait");
        list.add(("C:\\.....\\scripts\\myBatchFile.bat"));
        list.add("batchVariable");
        String[] commands = new String[list.size()];
        commands = list.toArray(commands);
        Process p = Runtime.getRuntime().exec(commands);
        p.waitFor();
        closeWindow();
    }
    void closeWindow(){
        WindowEvent close = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(close);
        System.exit(0);
    }
}

批处理文件只对作为参数(batchVariable)传递给它的变量进行操作。应使用所有先前的命令来简单地运行批处理文件。问题是在批处理文件中的进程完成之前调用closeWindow()方法。因此,Windows任务管理器中出现的Java进程仍在运行,即使在调用closeWindow()时它应该关闭(如果我正确使用它)。当批处理文件中运行的进程完成时,我真的需要关闭所述进程。我尝试了不同的运行批处理文件的方法(例如使用ProcessBuilder),但无论我尝试什么,我都有同样的问题。

1 个答案:

答案 0 :(得分:0)

您可以修改批处理文件,使其仅在启动的流程结束时完成。