`

项目中遇到的 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 项目经验汇总(简历项目素材)

    5. **解决问题**:突出你在项目中遇到的关键问题和解决方案,展示你的问题解决能力。 6. **成果与影响**:列举项目上线后的实际效果,如提升了多少效率,节省了多少成本,或者为用户带来了什么价值。 在"Java项目...

    java项目开发实战案例

    在《Java项目开发实战案例》这个资源中,我们聚焦于Java技术在实际项目中的应用,通过具体的案例来深入了解系统开发的全过程。这个实战教程旨在帮助开发者掌握从需求分析到项目落地的各项技能,涵盖数据库设计、前后...

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

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

    公司真实项目源码(java)

    这样的项目源码对于学习者来说具有很高的价值,因为它提供了真实世界中的应用实例,帮助开发者了解如何在实践中运用Java技术。 【描述】中提到,这个项目已经包含了部署到服务器所需的全部组件,并且可以与导入的...

    java新手8个小项目

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

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

    在这个名为"java_Tank"的项目中,开发者利用Java实现了一个坦克大战小游戏。这个游戏虽然功能简单,但却是一个非常适合初学者进行实践和学习的Java项目。 游戏的核心机制是通过F2键实现重新开始,当屏幕上的敌人...

    很棒的毕业设计、课程设计、练手的java项目-仓库商品管理系统(文档+视频+源码).rar

    很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库...

    人事管理项目(java+mysql)源代码

    1. **Servlets和JSP**:Servlets是Java中处理HTTP请求的组件,可以接收和响应来自客户端的请求。JSP则是一种动态网页技术,允许在HTML页面中嵌入Java代码,以实现动态内容生成。两者结合,可以构建出功能强大的Web...

    JAVA_API1.6文档(中文)

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

    JAVA框架项目

    - **背景介绍**:《JAVA框架项目教程》是翰子昂实训体系丛书中的一部分,旨在通过真实的项目案例,为学习者提供贴近实际工作的JAVA技能训练。随着软件产业在全球范围内的快速发展,软件人才成为推动经济增长的关键...

    java简历上的项目集合大全

    Java项目经验大全 本文将对Java项目经验进行总结,涵盖物流管理系统、人力资源管理系统、网上图书销售系统、人事工资管理系统、网上购物系统、网上在线数字图书馆等六个项目,介绍每个项目的功能描述、技术架构、...

    80个java开发项目经验.pdf

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

    完整Java项目 内含SSM框架源码

    3. **MyBatis框架**:MyBatis是一个持久层框架,它简化了SQL操作,通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。在这个项目中,...

    韩顺平Java教学 坦克大战游戏源码+素材+文档

    在坦克大战的项目中,Java的面向对象特性被充分利用,通过定义各种类来构建游戏的各个元素,如坦克、子弹、障碍物等。学习这个源码,你可以看到如何使用类、对象、继承、封装和多态等核心概念。 其次,游戏源码部分...

    java项目开发10例源代码

    6. **数据结构与算法**:在这些项目中,你可能会遇到不同的数据结构(如链表、树、图)和算法(如排序、搜索)。学习这些基础知识有助于优化代码性能,解决复杂问题。 7. **异常处理与日志记录**:源代码中会展示...

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

    Java 实现国际化是一种重要的软件开发技术,特别是在构建多语言支持的应用程序时。国际化(i18n)使得软件能够适应不同国家和地区的语言环境,包括...在实际开发中,还需要结合项目需求和团队规范,灵活应用这些技术。

    tomcat部署java web项目遇到的问题及解决方法

    Tomcat 部署 Java Web 项目遇到的问题是开发和部署过程中的常见问题,需要认真对待和解决。通过本文提供的解决方案和示例代码,希望能够帮助大家更好地理解和解决 Tomcat 部署 Java Web 项目遇到的问题。

    经典java项目源代码

    2. **异常处理**:Java中的异常处理机制是通过try-catch-finally语句实现的,用于捕获和处理程序运行时可能出现的问题。 3. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等,是Java编程中数据组织和...

    Java企业及互联网项目实战

    《Java企业及互联网项目实战》是一本专注于Java技术在实际企业及互联网项目中的应用书籍。这本书的特点在于提供了源代码,让读者能够通过实践来深化理解,非常适合自学。 Java项目是IT行业中广泛应用的开发领域,...

    java+mysql 机票预订系统 项目实战

    【Java+MySQL 机票预订系统】是一个典型的基于Java编程语言和MySQL数据库的项目,它主要用于模拟实际生活中的机票购买流程,适用于学生进行期末数据库课程设计。这个系统包含了完整的源码,确保可以完美运行,并且...

Global site tag (gtag.js) - Google Analytics