从Java程序内部依次使用jar文件

问题描述 投票:0回答:1

我想通过传递i / o并从单个Java程序中读取它们的o / p来依次执行多个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());

我理想的执行顺序应该是:

Main Java(开始)JAR 1(开始和完成)JAR 2(开始和完成)Jar n ----主Java(停止)

我的知识仅限于当前代码正在进行的多处理。请帮助我了解它的工作原理以及如何实现我想要的方案。

java jar jvm multiprocessing
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.