【问题标题】:p.waitFor() does not wait for process to complete (Java)p.waitFor() 不等待进程完成(Java)
【发布时间】:2013-12-14 16:47:34
【问题描述】:

这是该线程的一个分支:Killing a JFrame/Java when process finishes

我知道这个问题在 SO 上已被多次问过,但似乎没有一个答案能解决我的问题。我遇到的问题是:我有一个调用批处理文件的 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),但无论我尝试什么,我都会遇到同样的问题。

【问题讨论】:

  • 我不明白使用start /wait 而不是仅仅执行批处理文件的动机。是为了避免stdin/stdout的麻烦吗?
  • 在阅读了我之前发布的链接后,我添加了 /wait。最初我只有“开始”。 “/wait”应该会强制 cmd.exe 仅在批处理文件中的进程完成时告诉 waitFor() 它已完成。但是,情况并非如此,我遇到了和以前一样的问题。
  • 但是为什么要start呢?
  • 我相信实际运行批处理文件需要“启动”,不是吗?
  • cmd /c 部分是必需的,而不是像在命令行中那样仅仅命名批处理文件; start 不是。但请注意,存在消耗执行的任何输出的问题。

标签: java process


【解决方案1】:

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

【讨论】:

  • 你建议我怎么做?我目前将其设置为(例如)对变量进行操作,回显变量的新值,然后退出
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-06-09
相关资源
最近更新 更多