gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:07:40 28 4
gpt4 key购买 nike

我想通过传递 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());

我理想的执行顺序是:

  • 主java(启动)
  • JAR 1(开始并完成)
  • JAR 2(开始并完成)
  • jar ----
  • 主要 Java(停止)

我对当前代码所进行的多处理的了解有限。请帮助我了解它是如何工作的以及如何实现我想要的场景。

最佳答案

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

由于您只是读取输出以将其重新打印到控制台(或者通常写入标准输出),因此您可以使用 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…调用还可用于配置各个 channel 以使用管道或读取/写入文件。

关于java - 从 Java 程序内部顺序执行 jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677119/

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