環境: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時正常工作。任何想法爲什麼?
你能告訴我們你用於創建過程和等待它的代碼嗎? – Hulk
也可能相關:您創建什麼樣的過程?作爲[Process]的JavaDocs(https://docs.oracle.com/javase/8/docs/api/java/lang/Process。html)指出:'創建進程的方法可能不適用於某些本機平臺上的特殊進程,例如本機窗口進程,守護進程,Microsoft Windows上的Win16/DOS進程或shell腳本。' – Hulk
您的子進程是否處理' myExe'產生更多的子進程? –