我正在尝试从java应用程序调用java.jar(它通过双击工作)。它正在使用下面的代码。主要问题是当被调用的jar开始工作(一个gui应用程序)时,ı不能使用我的main(另一个gui应用程序)应用程序。我认为它正在等待 exec 命令的结束。如何设法正确运行此 2 应用程序?
public void handle(Event arg0) {
Runtime runTime = Runtime.getRuntime();
try {
Process process = runTime
.exec("java -jar "D:\WORKSPACE\Deploy\Binary\XXXX.jar"");
BufferedInputStream inputStream = new BufferedInputStream(process.getInputStream());
BufferedInputStream errorStream = new BufferedInputStream(process.getErrorStream());
int n1;
byte[] c1 = new byte[4096];
StringBuffer standardOutput = new StringBuffer();
while ((inputStream.read(c1) != -1)) {
standardOutput.append(c1.toString());
}
System.out.println("Standard Output: " + standardOutput.toString());
int n2;
byte[] c2 = new byte[4096];
StringBuffer standardError = new StringBuffer();
while (errorStream.read(c2) != -1) {
standardError.append(c2.toString());
}
System.out.println("Standard Error: " + standardError.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
});
问题在于您的流消耗代码...
while ((inputStream.read(c1) != -1)) {
standardOutput.append(c1.toString());
}
System.out.println("Standard Output: " + standardOutput.toString());
int n2;
byte[] c2 = new byte[4096];
StringBuffer standardError = new StringBuffer();
while (errorStream.read(c2) != -1) {
standardError.append(c2.toString());
}
当您尝试从任一流读取时,您将阻止调用线程,这可能是事件调度线程。
你需要的是两件事。
- 处理执行流程和
Thread
- 处理流读取的
Thread
例如,从进程打印 Java 输入流
我还强烈建议使用 ProcessBuilder
,除了它鼓励您为要传递给进程的每个参数使用单独的字符串(使处理使用空格的参数变得更加容易)之外,您还可以将错误字符串重定向到 InputStream
中,使其更易于管理......