java多进程中waitFor()的作用

来源:互联网 发布:java房卡麻将游戏源码 编辑:程序博客网 时间:2024/06/08 03:24

在项目中遇到这样的情况:在项目中引入子进程,发现子进程并没有成功运行完成,看不到输出信息不知道怎么回事。度娘后发现问题在于子进程的标准输出流占满缓冲池导致进程阻塞,需要另开两个进程在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);
0 0