這是該線程的副產品:Killing a JFrame/Java when process finishesp.waitFor()不會等待過程來完成(JAVA)
我知道這個問題已經被問不同的時間在這裏SO,但沒有一個答案似乎解決我的問題。我遇到的問題是這樣的:我有一個調用批處理文件的java程序。我需要在Java程序繼續之前完成批處理文件。爲此,我使用waitFor()方法,該方法應該等到進程結束。但是,它沒有。我發現這個線程,這表明waitFor()實際上等待的進程只是cmd.exe,它在實際進程之前返回。 Runtime.exec().waitFor() doesn't wait until process is done 該線程建議使用/等待命令,但是當我這樣做沒有區別。我的代碼是非常深入的幾個類,都依賴於彼此,但這裏是一個嘗試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()方法。因此,即使在調用closeWindow()時(如果我正確使用它)它應該關閉,Windows任務管理器中出現的Java進程仍會繼續運行。當從批處理文件運行的進程完成時,我確實需要關閉進程。我嘗試了不同的方法來運行批處理文件(例如使用ProcessBuilder),但不管我嘗試什麼,我都遇到同樣的問題。
我不明白使用'start/wait'而不是僅執行批處理文件的動機。是否要避免stdin/stdout的麻煩? –
我在閱讀之前發佈的鏈接後添加/等待。本來我只是「開始」。 「/ wait」假定強制cmd.exe只在wait文件的批處理文件中的進程完成時才告訴waitFor()。然而,情況並非如此,我遇到了和以前一樣的問題。 – DerStrom8
但是爲什麼'開始'? –