这是这个线程的衍生:当进程完成时杀死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),但无论我尝试什么,我都会遇到同样的问题。
您可以修改批处理文件,使其仅在启动的进程完成时完成。