java多进程中waitFor()的作用

在项目中遇到这样的情况:在项目中引入子进程,发现子进程并没有成功运行完成,看不到输出信息不知道怎么回事。度娘后发现问题在于子进程的标准输出流占满缓冲池导致进程阻塞,需要另开两个进程在waitFor()之前将子进程的标准输出流和错误流从缓冲池中取走。具体原因见http://blog.csdn.net/jimzhai/article/details/7864806

从缓冲池读取子进程标准输出和错误流的线程:

public class StreamGobbler extends Thread {

    InputStream is;
    String type;

    public StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                if (type.equals("Error")) {
                    System.out.println("Error    :" + line);
                } else {
                    System.out.println("Debug:" + line);
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

对子进程p,创建两个读取子进程缓冲区输出流和错误流的线程,并在waitFor()之前读取出来:

public class ClearOutputAndErrorStream {

    public void clearProcessOutputstream(Process p) throws InterruptedException {
        //p.getInputStream() : Returns the input stream connected to the normal output of the subprocess.
        //The stream obtains data piped from the standard output of the process represented by this Process object.
        StreamGobbler outstream = new StreamGobbler(p.getInputStream(), "Output");
        //p.getErrorStream() : Returns the input stream connected to the error output of the subprocess.
        //The stream obtains data piped from the error output of the process represented by this Process object.
        StreamGobbler errorstream = new StreamGobbler(p.getErrorStream(), "Error");
        outstream.start();
        errorstream.start();
        p.waitFor();
    }
}
Process p = Runtime.getRuntime().exec("java -cp ./lib/*;./bin test.TestDemo");
coaes.clearProcessOutputstream(p);
时间: 2024-11-05 20:58:11

java多进程中waitFor()的作用的相关文章

java项目中META-INF的作用中MANIFEST.MF的作用(转载)

发布Java应用程序时你会感到困难?好在Java提供了一系列打包和发布工具,可以显著的简化发布过程 该文章提供了打包Java code的几种方法,我们将会探讨Java manifest 文件,给出用于管理JAR文件所依赖文件.估计跨平台发布所需的CLasspath的合适方法.我也会解释如何使用manifest包版本特性来确认包的兼容性... 什么是JAR文件? 在开发过程中,我们可以直接使用Java class文件来运行程序,但这并不是一个好方式,好在Java 提供了 JAR(Java Arch

【java】itoo项目实战之java Web 中web的作用

在ITOO中,每个war包下的web.xml都是一样的.它的结构如下: itoo中含有多个war包,而且每个war包中web.xml都和上图的结构一样,而且配置内容都是一样的. 在Javaweb 应用中可以包含HTML 文档,Servlet,JSP和相关java类等,为了Servlet容器能够顺利地找到javaWeb 应用中的各个组件,Servlet规范规定,javaWeb应用必须采取固定的目录结构,即每种类型的组件在Web应用中都有固定的存放目录.Servlet规范还规定,javaWeb应用的

java 构造方法中super()的作用?

手贱百度了一下 :java里面自定义类的有参构造方法为什么不用super() 举个例子: class Father { Father(){print ('father');}; } class Son { Son(){print ('son')}; } 如果只是这样,那么构造Son之前会在后台调用一下super()函数,调用过程你看不到,但是确实执行了,结果是先father后son但是这种时候你显示的写个super就没有意义了,那么他在什么时候用呢,再举个例子 给你举个例子 class Fath

java中super的作用

super()的作用 super可以用来访问超类的构造方法和被子类所隐藏的方法,如果子类中有方法与超类中的方法名称和参数相同,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父类中所隐藏的语法格式如下: super(参数列表)或super.方法名(参数列表) 下面通过代码展示一下super的用法: package cn.demo; public class Demo1 { public static void main(String[] args) { SubClass_A

【JAVA学习】struts2 中 Actionsupport 的作用

尊重原创:http://xumiao900.iteye.com/blog/469760 Action 跟 Actionsupport 的区别 当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢? Action接口有: public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE

Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用

//方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class Logi

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

Java中hashCode的作用

转  http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅读 评论(17) 收藏 举报  分类: JAVA实用笔记(142)  版权声明:本文为博主原创文章,未经博主允许不得转载. 以下是关于HashCode的官方文档定义: [plain] view plain copy hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,j

java 中 静态块的作用

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就