2015-11-09 121 views
2

環境:Windows 7Java:等待所有子進程完成

我正在啓動一個外部進程ProcessBuilder。這個外部程序可以用定義要使用多少個CPU核的參數來調用。然後啓動儘可能多的進程來執行計算。

這個問題似乎是,初始調用的進程然後立即終止。所以process.waitFor()實際上並沒有等待計算完成。

我怎樣才能讓它等待子彈過程呢?或者我該如何等待,直到特定名稱的所有進程都被終止了?

EDIT由於評論:

ProcessBuilder pb = new ProcessBuilder("myExe", "-i", inputFile, "-o", outputFile, "-np", "4"); 
pb.directory(new File(tempPath)); 
Process myProcess = pb.start(); 
myProcess.waitFor(); 

過程是一個3第三方exe文件(沒有GUI)。

EDIT 2可能的解決方法(它有另外一個問題):

作爲一種變通方法我試過用谷歌找到了解決辦法:

while(wait) {  
    Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe /fi \"imagename eq myExe.exe\""); 

    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream(), "US-ASCII")); 

    while ((line = input.readLine()) != null) {   
     if (line.startsWith("INFO: No tasks are running")) { 
       wait = false; 
     } 
    } 
    if (wait) { 
     Thread.sleep(2000); 
    } 
    input.close(); 
} 

這應返回所有進程的列表,與給定的名稱。問題是從Java調用時列表總是空的,但是當從手動調用cli時正常工作。任何想法爲什麼?

+0

你能告訴我們你用於創建過程和等待它的代碼嗎? – Hulk

+0

也可能相關:您創建什麼樣的過程?作爲[Process]的JavaDocs(https://docs.oracle.com/javase/8/docs/api/java/lang/Process。html)指出:'創建進程的方法可能不適用於某些本機平臺上的特殊進程,例如本機窗口進程,守護進程,Microsoft Windows上的Win16/DOS進程或shell腳本。' – Hulk

+0

您的子進程是否處理' myExe'產生更多的子進程? –

回答

0
  • 類似Java的骯髒的解決方案

    目前java.lang.Process中比較差,並且越來越豐富。 例如,here您可以找到功能請求。在java中8, 你已經有一個像的IsAlive方法destroyForcibly所以 你可以嘗試像下面這樣骯髒的解決方案:

    1. Get the id of the main process反射。
    2. Get the child processes - 特定的Windows
    3. Wait for the found child processes

    步驟2和3可以實現爲一個腳本,執行作爲 java.lang.Process.waitFor

  • 與工作可執行文件

    我想,可執行文件是某種M PI程序。如果你有權訪問源代碼,我最好將它改爲正確工作並等待所有線程。

+0

是的,你對MPI程序是正確的。但是修復超出了範圍。 –