我有一些使用 Runtime.exec() 运行外部 .jar (作为 IzPack 安装程序构建)的代码。
如果我从命令行运行这个 external.jar,如下所示:
java -jar external.jar
然后,在应用程序完成之前,命令提示符不会返回控制权。但是,如果我从某个 java 类中运行 external.jar,请使用:
Process p = Runtime.getRuntime().exec("java -jar external.jar");
int exitCode = p.waitFor();
System.out.println("Process p returned: " + exitCode);
Then p
几乎立即返回,成功代码为0
,尽管 external.jar 尚未完成执行(我也通过ProcessBuilder
外部文件执行的路径)。
为什么它等待从命令行返回,但在另一个 java 程序中执行时则不等待?
我还设置了 3 个 jar,A、B 和 C,其中 A 调用 B,B 调用 C(使用Runtime.exec()
),其中 CThread.sleep
s 10 秒,作为一个简单的测试,正如预期的那样,A 运行后 10 秒才返回。
我认为这可能是 external.jar 的某种线程问题,其中执行从一件事移交给另一件事,但考虑到它直接从命令行工作,我希望看到相同的行为(也许天真地)当从另一个 java 程序中调用时。
我已经在 Windows 和 Ubuntu 上使用 Java 6 进行了测试。
Thanks!
实现此目的的另一种可能方法是捕获该过程的输出并等待其完成。
例如:
Process tr = Runtime.getRuntime().exec( new String[]{"wkhtmltopdf",mainPage,mainPagePDF});
BufferedReader stdOut=new BufferedReader(new InputStreamReader(tr.getInputStream()));
String s;
while((s=stdOut.readLine())!=null){
//nothing or print
}
通常输出流是 tr.getInputStream() 但根据您正在执行的程序,进程输出流可能是:
- tr.getInputStream()
- tr.getErrorStream()
- tr.getOutputStream()
通过执行此 while 循环,您可以强制程序等待该过程完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)