2013-07-31 109 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是否成功退出,或者是否发生错误(非零退出代码)。

+2

对于安装程序来说,一些天真的设计可能无效地返回0退出代码以发生错误。我前段时间实际上遇到了一个问题,调试很痛苦。 – hexafraction

+3

Ahw ...那简直是伤心:( – mthmulders

+0

是的,这是一个很有价值的警告,我指的是安装程序的设计令人伤心 – mthmulders

4

可以使用Process.waitFor()方法

和医生说

造成当前线程到等待,如果必要的话,直到通过此处理对象表示的进程 已终止。如果子进程已经终止,则此方法立即返回 。如果 子流程尚未终止,则调用线程将被阻止 ,直到子流程退出。

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"); 
相关问题