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

从Java程序内部顺序执行jar文件,java,jar,jvm,multiprocessing,Java,Jar,Jvm,Multiprocessing,我希望通过传递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.getErro

我希望通过传递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启动 jar1启动并完成 jar2启动并完成 罐子-- 主要Java站点
我的知识在当前代码的多处理方面是有限的。请帮助我了解它是如何工作的,以及如何实现我想要的场景。

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

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

Process pb = new ProcessBuilder("java", "-jar", "path/to/jar").inheritIO().start();
pb.waitFor();
然后,您不需要做任何事情来将子流程的“输出”传输到您的流程的“输出”,并且不存在死锁的可能性


继承是有魔力的。它是.redirectInputRedirect.INHERIT.redirectOutputRedirect.INHERIT.redirectErrorRedirect.INHERIT的缩写。这些重定向…调用还可用于配置单个通道以使用管道或从文件读取/写入文件。

为什么不能在sh脚本中运行它?谢谢。我试过了,它通过打印控制台o/p来执行jar文件。但它不会返回主程序继续调用序列中的下一个jar文件。jar执行结束即终止程序。如何将控件返回到主进程?在我的子进程结束时添加System.exitint后,它将返回。听起来应用程序正在创建未标记为“daemon”的其他线程。当没有非守护进程线程处于活动状态时,JVM将自动退出。否则,需要显式的System.exit…一个常见的错误源将是一个未关闭的线程池。