windows环境下,JAVA调用Runtime.getRuntime()执行命令时线程阻塞

问题描述

最近在研究开源代码jhipster-online时,在执行将代码自动打包上传到gitlab上时,总是不成功。调试时总是阻塞在读取输出的地方。具体表现为:

  1. 程序原本应该有很多输出,但是当调用Runtime,getRuntime()实现时,无法输出。
  2. 只有在强制终止java程序后,才能得到想要的结果
  3. 在linux系统中一般没有问题,只有在windows下才能产生。

产生该问题的原因

因为执行的命令产生的标准输出比较多,而标准输出缓冲区不够大,由于缓冲区的问题,由于java进程没有清空写到缓冲区的内容,结果导致程序一直在等待。

解决方法

理论:利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。

方法:
现在感觉挺多的,我这实现了两种,可以供大家参考.

  1. 修改命令

原命令:

 jhipster.cmd --force-insight --skip-checks --skip-install --skip-cache --skip-git 

新命令:

cmd jhipster.cmd --force-insight --skip-checks --skip-install --skip-cache --skip-git 2>&1
  1. 修改输出代码
    将p.getInputStream()改成p.getErrorStream(),如下
 BufferedReader input =
                new BufferedReader
                    (new InputStreamReader(p.getErrorStream()));
            while ((line = input.readLine()) != null) {
                log.debug(line);
                this.logsService.addLog(generationId, line);
            }
            input.close();
        } catch (Exception e) {
            log.error("Error while running the process", e);
        }

参考致谢

  1. windows环境下,JAVA调用Runtime.getRuntime()执行命令时线程阻塞的解决办法

  2. Java中Process和Runtime()使用,以及调用cmd命令阻塞在process.waitfor( )的问题解决

你可能感兴趣的:(学习记录)