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