0

我正在尝试从java应用程序调用java.jar(它通过双击工作)。它正在使用下面的代码。主要问题是当被调用的jar开始工作(一个gui应用程序)时,我无法使用我的主(另一个 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();
            }
        }
    });
4

1 回答 1

1

问题在于您的流消费代码......

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. AThread处理执行过程和
  2. AThread处理读取流

例如从进程打印 Java InputStream

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

于 2013-09-30T07:41:30.260 回答