2014-04-06 2 views
1

안녕하세요 모든 Java 개발자, JVM에 대한 간단한 질문이 있습니다. JVM이 스레드를 기다리는 시간을 알고 싶습니다. 예를 들어 는이 코드를 살펴 : "myShellCommand"영원히 실행하는 것이JVM이 스레드를 기다리는 시간

public static void main(String[] args) { 
p = Runtime.getRuntime().exec("myShellCommand -p1 v1 -p2 v2"); 
p.waitFor(); 
System.out.println("End ....:)"); 
} 

는 가정, 무슨 다음 일이? JVM은 여전히 ​​영원히 기다리고 있습니까?

+1

예, 그렇습니다. 그것은 영원히 달려야합니다. – Jason

답변

1

waitFor 메소드는, 필요하다면,이 Process 객체가 나타내는 프로세스가 종료 할 때까지 현재 스레드를 기다리게한다. 이 메소드는, 서브 프로세스가 벌써 종료하고있는 경우에 즉시 복귀합니다. 하위 프로세스가 아직 종료되지 않은 경우 서브 프로세스가을 종료 할 때까지 호출 스레드 이 차단됩니다 (Javadoc부터).

설명서에 따르면, 나는 그것이 영원히 달릴 것이라고 생각합니다.

0

경우에 따라 JVM은 시작한 프로세스가 종료 될 때까지 계속 대기합니다.

그러나 다른 "프로세스 모니터"스레드를 시작하여 적당한 시간 동안 기다리거나 잠자기 한 다음 이 주 스레드을 인터럽트 할 수 있습니다. 현재의 thread가 다른 thread에 의해 중단되는 경우 WAITFOR 방법 의 javadoc는 당으로

  1. 그것은 대기, 대기를 종료이며 예외 : InterruptedException가 발생된다.
0

@Kaoutar

귀하의 요구 사항은, 예를 프로세스를 실행 한 후 합리적인 기간 후 JVM을 종료하는 경우 10 분이면 다음과 같이 할 수 있습니다.

public static void main(String[] args) 
{ 
Thread subProcessThread = new Thread(new Runnable() 
          { 
           @Override 
           public void run() 
           { 
            Process p; 
            try 
            { 
            p = Runtime.getRuntime().exec("myShellCommand -p1 v1 -p2 v2"); 
            p.waitFor(); 
            System.out.println("End ....:)"); 
            } 
            catch (IOException e) 
            { 
            e.printStackTrace(); 
            } 
            catch (InterruptedException e) 
            { 
            e.printStackTrace(); 
            } 
           } 
          }); 
subProcessThread.start(); 
long waitTimeInMillis = 10 * 60 * 1000; 
subProcessThread.join(waitTimeInMillis); 

} 
관련 문제