我想通过传递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…
调用还可用于配置各个通道以使用管道或读取/写入文件。