Java Process获取输出并设置超时

时间:2017-01-05 17:37:42

标签: java multithreading process inputstream

如何获得流程'设置超时值时输出?

我目前正在使用apache commons io utils从进程中创建一个String'标准和错误输出。

下面的代码(带注释)适用于终止的进程。但是,如果该过程没有终止,主线程也不会终止!

如果我取消注释注释代码并注释掉process.waitfor(),则该方法将正确销毁非终止进程。但是,对于终止过程,不能正确获得输出。看来,一旦waitfor()完成,我就无法得到这个过程'输入和错误流?

最后,如果我尝试将注释部分移动到process.waitfor()当前所在的位置,请删除process.waitfor()并取消注释注释部分,然后对于非终止进程,主线程也会赢得&t; t停。这是因为永远不会达到process.waitfor(15,...)。

private static Outputs runProcess(String command) throws Exception {
    Process process = Runtime.getRuntime().exec(command);

    // if (!process.waitFor(15, TimeUnit.SECONDS)) {
    // System.out.println("Destroy");
    // process.destroy();
    // }

    // Run and collect the results from the standard output and error output
    String stdStr = IOUtils.toString(process.getInputStream());
    String errStr = IOUtils.toString(process.getErrorStream());

    process.waitFor();

    return new Outputs(stdStr, errStr);
}

1 个答案:

答案 0 :(得分:4)

正如@EJP建议的那样,您可以使用不同的线程捕获流或使用self.label = QtGui.QLabel(self) self.label.setText("Welcome To Python GUI") self.label.resize(100, 50) 或从命令重定向到文件。
以下是我认为可以使用的3种方法。

  1. 为Streams使用不同的线程。

    ProcessBuilder
  2. 使用 Process process = Runtime.getRuntime().exec("cat "); ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2); Future<String> output = newFixedThreadPool.submit(() -> { return IOUtils.toString(process.getInputStream()); }); Future<String> error = newFixedThreadPool.submit(() -> { return IOUtils.toString(process.getErrorStream()); }); newFixedThreadPool.shutdown(); // process.waitFor(); if (!process.waitFor(3, TimeUnit.SECONDS)) { System.out.println("Destroy"); process.destroy(); } System.out.println(output.get()); System.out.println(error.get());

    ProcessBuilder
  3. 在命令中使用重定向运算符重定向输出&amp;文件出错,然后从文件读取。

  4. Here非常好的博客解释了处理ProcessBuilder processBuilder = new ProcessBuilder("cat") .redirectError(new File("error")) .redirectOutput(new File("output")); Process process = processBuilder.start(); // process.waitFor(); if (!process.waitFor(3, TimeUnit.SECONDS)) { System.out.println("Destroy"); process.destroy(); } System.out.println(FileUtils.readFileToString(new File("output"))); System.out.println(FileUtils.readFileToString(new File("error")));

    的不同方式