2013-07-31 4 views
4

기본적으로 일부 소프트웨어를 설치하는 작은 프로그램을 작성한 다음 나중에 해당 프로그램을 준비하기 위해 몇 가지 기본 명령을 실행합니다. 그러나 프로그램이 설치를 시작한 다음 즉시 다음 줄로 이동합니다 (등록, 업데이트 등). 물론, 완전히 설치 될 때까지 그런 일이 일어날 수 없기 때문에 두 번째 프로세스를 실행하기 전에 첫 번째 프로세스를 기다리는 방법을 찾고 싶습니다. 예를 들어,Java로 진행하기 전에 프로세스가 완료 될 때까지 기다리십시오.

Main.say("Installing..."); 
    Process p1 = Runtime.getRuntime().exec(dir + "setup.exe /SILENT"); 
    //Wait here, I need to finish installing first! 
    Main.say("Registering..."); 
    Process p2 = Runtime.getRuntime().exec(installDir + "program.exe /register aaaa-bbbb-cccc"); 
    Main.say("Updating..."); 
    Process p4 = Runtime.getRuntime().exec(installDir + "program.exe /update -silent"); 

답변

14

Process#waitFor()으로 전화하십시오. 그 Javadoc는 다음과 같이 말하고있다 :

Process이 나타내는 프로세스가 종료 될 때까지 현재 쓰레드를 기다린다.

보너스 : 하위 프로세스의 종료 값을받습니다. 따라서 코드 0으로 성공적으로 종료되었는지 여부 또는 오류가 발생했는지 여부 (0이 아닌 종료 코드)를 확인할 수 있습니다.

+2

설치 프로그램에 대한 순진한 디자인은 오류 0 종료 코드를 잘못 반환 할 수 있습니다. 사실 몇 시간 전에이 문제가 있었는데 디버깅하는 것이 어려웠습니다. – hexafraction

+3

Ahw ... 그건 슬픈 일입니다. ( – mthmulders

+0

예, 설치자가 슬프다는 디자인에 대해 말하고 있습니다. – mthmulders

4

당신은 Process.waitFor() 방법

를 사용할 수 있으며 문서는

필요한 경우 에 현재의 thread가이 Process 객체가 나타내는 프로세스 때까지, 기다려 원인 말한다 종료되었습니다. 하위 프로세스가 이미 종료 된 경우이 메서드는 즉시 을 반환합니다. 하위 프로세스가 아직 종료되지 않은 경우 하위 프로세스가 종료 될 때까지 호출하는 스레드는 으로 차단됩니다.

0

포함 waitFor(). 귀하의 경우 귀하의 코드는 다음과 같습니다.

Main.say("Installing..."); 
    Process p1 = Runtime.getRuntime().exec(dir + "setup.exe /SILENT"); 
    p1.waitFor() 
    Main.say("Registering..."); 
    Process p2 = Runtime.getRuntime().exec(installDir + "program.exe /register aaaa-bbbb-cccc"); 
    Main.say("Updating..."); 
    Process p4 = Runtime.getRuntime().exec(installDir + "program.exe /update -silent"); 
관련 문제