2012-11-23 4 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()에 의해 Throw 된 InterruptedException을 잊어 버렸습니다. 고마워. –

3

번호 그것은 당신이 당신의 코드를 작성 단지 방법이 생성 프로세스가 계층 구조의 일종을 가지고 있다는 것을 의미한다. 첫 번째 프로세스가 종료 될 때까지 블로킹을하고 있으며 불행하게도 두 번째 프로세스가 먼저 종료되면 코드가이를 알 수 없습니다.

Java에서 "waitForEitherProcess"메소드를 제공하지 않으므로 프로세스 상태를 폴링 루프를 통해 확인해야합니다. 주기적으로 각 프로세스에서 exitValue를 호출 한 다음 몇 밀리 초 동안 대기합니다. exitValue가 int를 반환하면 프로세스가 종료되었습니다. 예외를 throw하면 예외가 발생하지 않습니다. 이 프로세스를 사용하여 종료 된 프로세스와 종료해야하는 프로세스를 결정할 수 있습니다.

+0

또한 두 번째 println에 copy-pasta typo가 있는데, 이는 child_1이 먼저 완료되었다고 말합니다 ... – Jeff

관련 문제