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( )的问题解决

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值