从 Java 程序内部按顺序执行 jar 文件



我想通过传递I/O并从单个Java程序读取它们的输出来顺序执行多个jar文件。我使用下面的代码在我的 java 代码中调用我的 jar。这会导致多个 JVM 实例,并且在我停止执行我的主 java 程序之前,jar 执行不会完成。

Process pb = Runtime.getRuntime().exec("java -jar path/to/jar");
pb.waitFor();
BufferedReader ib = new BufferedReader(new InputStreamReader(pb.getErrorStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(pb.getInputStream()));
System.out.println(in.readLine());

我理想的执行顺序是:

  • 主爪哇(启动(
  • JAR 1(开始和完成(
  • JAR 2(开始和完成(
  • 罐子和----
  • 主爪哇(停止(

我的知识在我当前代码的多处理方面受到限制。请帮助我了解它是如何工作的,以及如何实现我想要的场景。

一旦子进程产生的输出超过管道的缓冲能力,它就会被阻止,直到启动进程读取数据。当您在读取任何内容之前等待子进程结束时,这可能会导致死锁。

由于您只是读取输出以将其重新打印到控制台(或者通常写入 stdout(,因此您可以使用ProcessBuilder告诉它不使用管道,而是将子进程的 stdio 连接到您的进程的 stdio:

Process pb = new ProcessBuilder("java", "-jar", "path/to/jar").inheritIO().start();
pb.waitFor();

然后,您无需执行任何操作即可将子进程的输出传输到进程的输出,并且没有死锁的可能性。

inheritIO()施展魔术。这是.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT)的简写。这些redirect…调用还可用于配置各个通道以使用管道或读取/写入文件。

相关内容

  • 没有找到相关文章

最新更新