2012-11-23 83 views
0

我有一個任務,我必須創建一個進程的兩個實例,而其他進程必須在其中一個進程終止時終止。我只能在關閉創建的第一個進程時執行此操作,這是否意味着創建的進程具有某種層次結構,即使它們都是同一進程的子進程?同時殺死這兩個進程

在此先感謝。

ProcessBuilder pb = new ProcessBuilder(args); 
Process proc_1 = pb.start(); 
Process proc_2 = pb.start(); 
System.out.println("Child is running...wait for child to terminate"); 

int exitValue_1 = proc_1.waitFor(); 
System.out.println("Child_1 finished with exit value -> " + exitValue_1); 
if(exitValue_1==0) proc_2.destroy(); 

int exitValue_2 = proc_2.waitFor(); 
System.out.println("Child_1 finished with exit value -> " + exitValue_2); 
if(exitValue_2==0) proc_1.destroy(); 
+1

您將需要使用線程。你將有一個知道兩個子線程的主線程(併產生它們)。兩個子線程將執行這些進程。當第一個進程返回時,這個子線程會通知主線程,它會通知仍在運行的線程。主線程將等待兩個子線程完成... – MadProgrammer

+0

這樣做,但我不能在此任務中使用線程。 –

+0

您可以使用一個循環並檢查每個進程的退出值(如果進程沒有退出,則拋出一個'IllegalThreadStateException'),只要返回一個值而沒有拋出異常,它必須完成... – MadProgrammer

回答

2

Process#exitValue會拋出一個IllegalThreadStateException如果進程還沒有退出,你可以利用這個。

ProcessBuilder pb = new ProcessBuilder(args); 
Process proc_1 = pb.start(); 
Process proc_2 = pb.start(); 

boolean running = true; 
while (running) { 
    try { 
     int exitValue = proc_1.exitValue(); 
     System.out.println("Child_1 finished with exit value -> " + exitValue); 
     if(exitValue==0) { 
      proc_2.destroy(); 
      running = false; 
      break; 
     } 
    } catch (IllegalThreadStateException exp) { 
    } 
    try { 
     int exitValue = proc_2.exitValue(); 
     System.out.println("Child_2 finished with exit value -> " + exitValue); 
     if(exitValue==0) { 
      proc_1.destroy(); 
      running = false; 
      break; 
     } 
    } catch (IllegalThreadStateException exp) { 
    } 
} 
+0

是的,只專注於int返回並忘記了由exitValue()引發的InterruptedException。非常感謝。 –

3

這是否意味着創建的進程具有某種層次,

號這只是你寫你的代碼的方式。直到第一個進程退出,您纔會阻塞,不幸的是,如果第二個進程先退出,您的代碼無法知道這一點。

由於Java沒有爲您提供「waitForEitherProcess」方法,我認爲您需要執行輪詢循環來檢查進程的狀態。定期調用每個進程的exitValue然後休眠幾毫秒。如果exitValue返回一個int,則該過程已終止。如果它拋出一個異常它沒有。用它來決定哪個進程已經退出,哪些需要被終止。

+0

此外,在第二個println中有複製意大利麪錯誤,這意味着它說,child_1首先完成... – Jeff