2012-02-01 2 views
1

저는 방금 시작한 모든 프로세스가 JVM이 종료 될 때 죽어 가고 있지 않다는 것을 깨달았습니다. 내가 Process을 종료하는 방법이 있습니까? File.deleteOnExit()과 같은 종류의 JVM이 있습니까?종료 할 때 JVM을 시작한 프로세스를 종료시킬 수 있습니까?

+1

대부분의 경우 JVM을 종료하고 프로세스를 종료하는 것은 서로 동의어입니다. 자신의 경우에 정확히 무엇이 일어나는지 (또는 적어도 증상이 무엇인지) 조금 더 자세하게 설명해 주시겠습니까? – NPE

+0

'Runtime.addShutdownHook' 그리고 무엇이든 할 수 있습니다. – bestsss

답변

1

종료하기 전에 각 Process.waitFor() 메서드를 호출해야합니다. 당신은뿐만 아니라 당신이 원하는만큼 그 과정을 제어 할 수없는 경우

, 당신은 Runtime.addShutdownHook()을 사용할 수

final Process process = startNewProcess(); 
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    @Override 
    public void run() { 
     process.waitFor(); 
    } 
})); 

난 정말하지만, 가능하면 후자의 솔루션을 사용하지 않는 것이 좋습니다. JVM이 자체를 지울 기회가 없으면 프로세스가 강제로 종료되면 계속 실행됩니다.

+0

그래서'waitFor()'는 JVM 종료 프로세스를 죽일 것입니까? 나는 이미'waitFor()'를 실행하고 있지만 아마도 IO 때문에 호출되지 않을 수도 있습니다. 조사 할게. –

+0

'waitFor()'는 프로세스가 끝날 때까지 실행중인 쓰레드를 차단합니다. 나는 당신이 당신의 정상적인 흐름의 끝에 그것을 두어야한다고 말하고 있습니다. 그렇지 않으면 내 대안 솔루션을 사용할 수 있습니다. –

+0

Ctrl + C와 같이 프로세스에 신호를 보낼 수 있습니까? –

0

실행중인 모든 프로세스의 목록을 유지 한 다음 Process.destroy()를 사용하여 언급 한 Platinum Azure와 같은 종료 훅 내부에서 프로세스를 종료 할 수 있습니다.

또한 프로세스가 완료되면 목록을 정리해야합니다. 이미 process.waitFor()를 호출하는 코드가 있으면 목록을 정리할 수 있습니다.

destroy 메소드는 프로세스를 강제 종료하여 수행중인 작업을 손상시킬 수 있으므로 사용시주의해야합니다.

다른 프로세스를 제어하는 ​​경우 프로세스를 종료하도록 신호를 보내고 프로세스가 완료 될 때까지 기다린 다음 destroy를 호출하는 것이 좋습니다.

관련 문제