Java 应用程序等待完成 java exec 命令以再次正常工作



我正在尝试从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());
}

当您尝试从任一流读取时,您将阻止调用线程,这可能是事件调度线程。

你需要的是两件事。

  1. 处理执行流程和Thread
  2. 处理流读取的Thread

例如,从进程打印 Java 输入流

我还强烈建议使用 ProcessBuilder ,除了它鼓励您为要传递给进程的每个参数使用单独的字符串(使处理使用空格的参数变得更加容易)之外,您还可以将错误字符串重定向到 InputStream 中,使其更易于管理......

最新更新