2014-09-04 77 views
3

如何讓我的java父進程等待子進程完成。我曾嘗試與runtime.execprocessBuilder.pb子進程既不會在Windows中完成也不會中止?

String cmd = "ffmpeg -i input.vob output.mp4" 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 
proc.waitFor(); 

這正常工作與小的輸入文件(比如小於10 MB)。如果我給較大的輸入文件,那麼程序將被掛起。輸出文件將被部分創建,文件創建將被掛起,控制將不會返回。即使proc.join(10000);也沒有給出任何有用的結果。這裏父進程在子進程(ffmpeg)完成之前終止。

如何克服這個問題?

+0

讀取和執行*所有*建議[當的Runtime.exec()不會(http://www.javaworld.com/article/2071275/核心的Java /時的運行時,EXEC ---韓元t.html)。然後忽略它是指'exec(..)'並使用'ProcessBuilder'來構建'Process'。還要將'String args'分解爲'String [] args'來解釋包含空格的參數。 – 2014-09-04 15:04:50

回答

3

您需要讀取進程輸出的數據。

一個進程有2個輸出流:標準輸出和錯誤輸出。您必須閱讀兩者,因爲該過程可能會寫入這兩個輸出。

該進程的輸出流有緩衝區。如果輸出流的緩衝區已滿,則嘗試將進一步的數據寫入進程被阻止。

做這樣的事情:

InputStream in = proc.getInputStream(); // To read process standard output 
InputStream err = proc.getErrorStream(); // To read process error output 

while (proc.isAlive()) { 
    while (in.available() > 0) 
     in.read(); // You might wanna echo it to your console to see progress 

    while (err.available() > 0) 
     err.read(); // You might wanna echo it to your console to see progress 

    Thread.sleep(1); 
}