调用Runtime.getRuntime().exec方法可能出现死锁情况,程序处于无响应状态,这是因为Runtime.getRuntime().exec方法需要自己处理stderr 及stdout流,而解决方法即是将它们导出用别的thread处理。
Process p = Runtime.getRuntime().exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
// kick off stderr
errorGobbler.start();
StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");
// kick off stdout
outGobbler.start();
p.waitFor();
package com.sdc.callmaxent.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import com.sdc.callmaxent.util.FileUtil;
/**
* 用于处理Runtime.getRuntime().exec产生的错误流及输出流
* @author shaojing
*
*/
public class StreamGobbler extends Thread {
InputStream is;
String type;
OutputStream os;
StreamGobbler(InputStream is, String type) {
this(is, type, null);
}
StreamGobbler(InputStream is, String type, OutputStream redirect) {
this.is = is;
this.type = type;
this.os = redirect;
}
public void run() {
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
if (os != null)
pw = new PrintWriter(os);
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null) {
if (pw != null)
pw.println(line);
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally{
FileUtil.close(pw);
FileUtil.close(br);
FileUtil.close(isr);
}
}
}
转载地址:http://blog.csdn.net/dysj4099/article/details/5985596
相关资料:http://saluya.iteye.com/blog/1260347
http://lavasoft.blog.51cto.com/62575/15599/