Java调用exe阻塞

转载自  Java调用exe阻塞

今天遇到了个奇怪的问题,用VC写了个小程序,编译成exe文件,然后用Java去调,居然卡住不运行了。

如果双击这个exe程序,单独让它运行,是可以的,那么为什么用Java调用就不好使了呢?
上网查了一下,原来是由于缓冲区的问题,也就是说Process的getErrorStream和getInputStream缓冲区没有清空。我在VC里要打印的东西太多了,以至于填满了缓冲区,这是缓冲区需要释放,我不但没释放还一个劲的运行程序,那么Java就卡在那里了。表面上好像是exe出了问题,其实是这个Process的缓冲区造成的。
解决方法:
InputStream is1 = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is1)); 
try {
    while(br.readLine() != null) ;
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

InputStream is2 = process.getErrorStream();
if(null != is2) {
    BufferedReader br2 = new BufferedReader(new InputStreamReader(is2)); 
    StringBuilder buf = new StringBuilder(); // 保存输出结果流
    String line = null;
    try {
        while(br2.readLine() != null) ;
        buf.append(line);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    System.out.println("输出结果为:" + buf.toString());
}
将上述代码加入程序就可以解决缓冲区的问题,建议单独开启线程去多。
我的代码里不需要getErrorStream()部分的代码,这两部分针对实际情况自由选择。


将上述代码加入程序就可以解决缓冲区的问题,建议单独开启线程去多。
我的代码里不需要getErrorStream()部分的代码,这两部分针对实际情况自由选择。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要优化 Java 调用 Ansible 的速度,可以考虑以下几个方面: 1. 减少网络延迟:确保 Java 应用程序与 Ansible 执行主机之间的网络连接稳定并具有较低的延迟。可以选择与 Ansible 执行主机在同一局域网内部署 Java 应用程序,或者使用高速、稳定的网络连接。 2. 使用异步调用:使用 Java 异步调用的方式调用 Ansible,以避免阻塞主线程。可以使用 Java 的多线程或者异步框架(如 CompletableFuture 或者 Reactive Stream)来实现异步调用。 3. 批量操作:尽量减少单个任务的调用次数,可以将多个操作合并为一个批量操作,减少与 Ansible 的通信次数。例如,可以将多个主机的操作合并为一个批量任务。 4. 优化 Ansible 脚本:确保 Ansible 脚本本身具有较高的执行效率。可以通过优化脚本逻辑、减少冗余操作、合理使用 Ansible 模块等方式来提升执行速度。 5. 缓存结果:如果某些操作结果是可缓存的,可以考虑将结果缓存起来,避免重复调用 Ansible。这样可以提高执行效率,并减少对 Ansible 的频繁调用。 6. 使用性能优化工具:使用性能优化工具(如 Java Profiler)来分析和定位性能瓶颈,从而进行针对性的优化。 总之,要优化 Java 调用 Ansible 的速度,需要综合考虑网络延迟、调用方式、批量操作、脚本优化、结果缓存等多个方面,根据实际情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值