`

项目中遇到的 Java啤酒爆炸

    博客分类:
  • java
阅读更多

    最近在做一项目,其中有一模块需要在页面上配置第三方提供的程序路径,配置完成后系统定时执行(quartz),也可以在页面上手动执行,ajax调用后台方法,执行第三方提供的程序,只要是读取固定格式的文件解析成图片,存到本地目录和数据库中。当要解析的文件很大的时候,就会遇到啤酒爆炸的问题。。。

    File file = new File(pro);
        if (file.exists()) {
          logger.info("seed程序开始执行....");
          ProcessBuilder procBuilder = new ProcessBuilder(file.getAbsolutePath());
          procBuilder.redirectErrorStream(true); //合并输出子进程的standard和error inputstream
          logger.info("合并子进程InputStream{}",procBuilder.redirectErrorStream());
          Process process = procBuilder.start();
         
          drainInBackground(process.getInputStream());
          int exit = process.waitFor();
          logger.info("seed程序退出{}", exit);
          josnResult = "exeok";
        } else {
          logger.info("seed程序未找到....");
          josnResult = "notfound";
        }

 

    /**
   * 启动一个线程,用于排空子进程的输出流,否则子进程会挂起
   */
  static void drainInBackground(final InputStream is) {
    new Thread(new Runnable() {
      public void run() {
        try {
          while (is.read() >= 0)
            ;
        } catch (IOException e) {
          // return on IOException
        }
      }
    }).start();
  }

 

    这里的教训是: 为了确保子进程能够结束,你必须排空它的输出流;对于错误流(error stream)也是一样,而且它可能会更麻烦,因为你无法预测进程什么时候会倾 倒(dump)一些输出到这个流中。在 5.0 版本中,加入了一个名为ProcessBuilder 的类用于排空这些流。它的 redirectErrorStream 方法将各个流合并起来,所以你只需要排空这一个流。如果你决定不合并输出流和错误流,你必须并行地 (concurrently)排空它们。试图顺序化地(sequentially)排空它们会导致子进程被挂起。

分享到:
评论

相关推荐

    技术总结(自己做项目遇到的问题整理)

    技术总结(自己做项目遇到的问题整理)java 技术总结(自己做项目遇到的问题整理)java

    java面试过程中遇到的问题总结

    这个是我个人面试的一些总结,希望给大家一些帮助。如果文档有欠缺或者的地方还请大家海涵,自己动手查找资料。(总结的比较粗糙)

    Java项目经验汇总(简历项目素材)

    Java项目经验汇总(简历项目素材)

    java 爆炸效果

    这个是实现蜗牛射击敌人的爆炸效果,java ,java,爆炸的代码

    java新手8个小项目

    特别适合java新手巩固java基础的项目,总共有8个项目的全部代码,都可以直接运行,代码有注释。

    Java 项目经验汇总(简历项目素材)

    Java项目经验汇总(简历项目素材)很完整的文档,值得学习 Java项目经验汇总(简历项目素材)很完整的文档,值得学习 很好很完善的项目描述 很好很完善的项目描述

    50个java编写的实战项目

    这里是50个java编写的实战项目,很适合想加强自己能力的人学习的,毕竟学习之后还是靠实践,这个真的很有用的,可以按需所求来寻找合适自己的项目去做。

    80个java开发项目经验.pdf

    80个java开发项目经验,适合应届生

    java开发常见问题

    java开发工作两年遇到的技术问题以及查找到的解决方案还有一些积累,涉及前端技术,android开发,java后台以及数据库sql优化,session共享,单点登录,kafka入门,websocket,线程安全等。

    java项目开发验收交接整套模板

    java项目开发验收交接整套模板,比如测试文档、接口文档、数据库设计、需求规格说明书、用户手册、开发规范。

    JAVA框架项目

    JAVA框架项目,学习java 的好文档,分享给各位

    java版山寨QQ项目源码

    java版山寨QQ项目 里面有四个压缩包 QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理...

    java项目开发中常见异常

    我相信,在我们做项目的时候,console框中常常出现各种的异常,时间久了,会发现常见的也几个,下面我总结一下常见的异常,供大家参考。  1 java.lang.UnsupportedClassVersionError  从字面上我们可以看出来是...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java经典项目集锦

    Java经典项目集锦

    JAVA项目实践合集

    自己收集的一些Java项目实践,总有你需要的资源! 好好学习,天天向上!(*^__^*) ……

    java_Tank.rar_java tank_java tank.gif_java项目练习_坦克 小游戏_爆炸

    java编写的坦克大战小游戏,功能简单,是一个学习java练习的小项目。功能:F2重新开始,敌人死光自动加入,简单的爆炸效果

    公司真实项目源码(java)

    这个是以前我们公司的项目 。只要布置到服务器,再把数据库导入就可以运行了。 共大家学习

    java 实现国际化 中英文语言切换

    java实现国际化中英文语言切换 java语言切换JSP国际化 java实现国际化中英文语言切换 java语言切换JSP国际化

    Java 程序设计与项目实践

    Java程序设计与项目实践配套光盘

Global site tag (gtag.js) - Google Analytics