2016-07-19 2 views
3

Windows PC에서 다른 응용 프로그램을 실행해야하는 응용 프로그램을 빌드하고 있습니다. 앱이 시작될 때 코드는 실행을 계속하기 위해 해당 프로그램을 닫을 때까지 기다려야합니다.Java process.waitFor()가 스레드를 차단하지 않습니다.

System.out.println("Starting ccleaner..."); 
Process p = Runtime.getRuntime().exec("C:\\Program Files\\CCleaner\\CCleaner64.exe"); 
System.out.println("Before wait"); 
p.waitFor(); 
//Here it should wait until the subprocess is 
// exited/the ccleaner programs exit button is clicked 
System.out.println("After wait"); 

일어나는 모든 일은 기다리지 않고 곧바로 실행됩니다. 나는 문서의 waitFor() 방법을 고개는 말한다 :

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

그리고 이것은 나에게 꽤 분명해 보입니다. 그러나이 사이트에서이 문제와 관련한 다른 질문을 살펴본 결과 스트림을 읽는 것과 관련된 몇 가지 해결책을 찾았습니다.하지만 대부분이 자신이 원하는 바트 파일을 가지고있을 때 이해합니다. 그러나 나는 이것도 시도했지만 제대로 작동시키지 못하고있다. 재미있는 점은 위의 코드는 tutorialpoints.com에서 제공되는 것과 거의 동일하다는 것입니다.

나는 또한 process.isAlive()을 사용해 보았지만 그 중 하나를 사용할 수는없는 것 같습니다.

내가 잘못하고있는 것을 아는 사람이 있습니까?

답변

1

waitFor() 정확히 예상 한대로 수행합니다. 너의 이해가 틀린 것은 아니다.

실행중인 프로그램이 실제로 즉시 종료되어 waitFor()이 곧바로 돌아 오는 것으로 의심됩니다. 부모 프로세스가 종료되는 동안 실제 작업을 수행하는 하나 이상의 자식 프로세스가 시작 중일 수 있습니다.

+0

OP가 _하지 않는 것은'waitFor()'의 반환 값을 분석하는 것입니다. –

+0

그건'waitFor()'의 블로킹에 영향을주지 않을 것입니다. –

+0

그렇습니다. 적어도 반환 값을 살펴보면 하위 프로세스가 수행중인 작업에 대해 설명 할 것입니다. –

관련 문제