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



这是这个线程的衍生:当进程完成时杀死JFrame/Java

我知道这个问题在SO上被问了很多次,但似乎没有一个答案能解决我的问题。我遇到的问题是:我有一个java程序,它调用一个批处理文件。在Java程序继续运行之前,我需要完成批处理文件。为此,我使用waitFor()方法,该方法应该等到进程结束。然而,事实并非如此。我发现了这个线程,这表明waitFor()进程实际上正在等待的只是cmd.exe,它在实际进程之前返回。Runtime.exec().waitFor()没有';不要等到处理完成该线程建议使用/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),但无论我尝试什么,我都会遇到同样的问题。

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

最新更新