2013-12-14 62 views
0

這是該線程的副產品: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),但不管我嘗試什麼,我都遇到同樣的問題。

+0

我不明白使用'start/wait'而不是僅執行批處理文件的動機。是否要避免stdin/stdout的麻煩? –

+0

我在閱讀之前發佈的鏈接後添加/等待。本來我只是「開始」。 「/ wait」假定強制cmd.exe只在wait文件的批處理文件中的進程完成時才告訴waitFor()。然而,情況並非如此,我遇到了和以前一樣的問題。 – DerStrom8

+0

但是爲什麼'開始'? –

回答

0

您可以修改批處理文件,使其僅在其啓動的進程完成時才結束。

+0

你會如何建議我這樣做?我現在設置爲(例如)對變量進行操作,回顯變量的新值,然後退出 – DerStrom8