gpt4 book ai didi

java - Runtime.exec().waitFor() 实际上并不是在等待

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:47 25 4
gpt4 key购买 nike

我有一些代码使用 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);

然后 p 几乎立即返回成功代码 0,尽管 external.jar 尚未完成执行(我也通过 尝试过ProcessBuilder 外部文件执行路径)。

为什么它等待从命令行返回,而不是在另一个 java 程序中执行时?

我还设置了 3 个 jar ,A、B 和 C,其中 A 调用 B,B 调用 C(使用 Runtime.exec()),其中 C Thread.sleeps 10 秒,作为一个简单的测试,正如预期的那样,A 在运行 10 秒后才返回。

我认为这可能是 external.jar 的某种线程问题,其中执行从一件事移交给另一件事,但鉴于它直接从命令行工作,我希望看到相同的行为(可能天真)从另一个 Java 程序中调用时。

我已经在使用 Java 6 的 Windows 和 Ubuntu 上对此进行了测试。

谢谢!

最佳答案

实现此目的的另一种可能方法是捕获过程的输出并等待它完成。

例如:

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 循环,您可以强制程序等待进程完成。

关于java - Runtime.exec().waitFor() 实际上并不是在等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com