[英]Wait for process to finish before proceeding in 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");
调用Process#waitFor()
。 它的Javadoc说:
如有必要,使当前线程等待,直到此
Process
对象表示的Process
终止。
奖励:您将获得子流程的退出值。 因此,您可以检查它是否以代码0
成功退出,或者是否发生错误(退出代码为非零)。
您可以使用Process.waitFor()
方法
而医生说
如有必要,使当前线程等待 ,直到此Process对象表示的进程终止。 如果子进程已经终止,则此方法立即返回。 如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。
包括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");
如果您正在运行返回非常长的响应字符串的系统命令,则stdin缓冲区将填满,并且进程似乎挂起。 sqlldr发生在我身上。 如果真是这样,请在进程运行时从stdin中读取。
try {
ProcessBuilder pb = new ProcessBuilder("myCommand");
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
StringBuffer response = new StringBuffer();
StringBuffer errorStr = new StringBuffer();
boolean alreadyWaited = false;
while (p.isAlive()) {
try {
if(alreadyWaited) {
// read the output from the command because
//if we don't then the buffers fill up and
//the command stops and doesn't return
String temp;
while ((temp = stdInput.readLine()) != null) {
response.append(temp);
}
String errTemp;
while ((errTemp = stdError.readLine()) != null) {
errorStr.append(errTemp);
}
}
Thread.sleep(1000);
alreadyWaited = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.debug("Response is " + response);
logger.debug("Error is: " + errorStr);
}
} catch (IOException e) {
logger.error("Error running system command", e);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.