可以考虑使用两个线程来同时清空process获取的两个输入流。
创建线程方法之一:实现Runnable接口
步骤:
1.定义类实现Runnable接口
2.重写run()方法,这个方法里面实现的是实际要做的操作。
3.定义一个方法,在里面实现该类的线程,同时调用线程的start()方法
例:public void start(){
Thread thread = new Thread(this);
thread.setDaemon(true);设置成守护线程
thread.start();
}
public class ProcessUitl implements Runnable{
public String getErrStr() {
return errStr;
}
public void setErrStr(String errStr) {
this.errStr = errStr;
}
//设置读取的字符编码
private String character = "utf-8";
private InputStream inputStream;
private String errStr = null;
public ProcessUitl(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream, character));//以utf-8的编码格式去读取文件
String line = null;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null){
sb.append(line);
}
errStr = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void start(){
Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();
}
public static void main(String[] args) {
String command = "ping www.baid.com";
Process ps = null;
try {
ps = Runtime.getRuntime().exec(command);
ProcessUitl pu = new ProcessUitl(ps.getErrorStream());
ps.getOutputStream().close();
ps.waitFor();
String errorStr = pu.getErrStr();
if(errorStr != null){
System.out.println("Error!!!!!");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
if(ps != null){
ps.destroy();
}
}
}
}
转载:以下部分
步骤:
1.定义实现Runnable接口
2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要讲Runnable接口的子类对象传递给Thread的构造方法。因为自定义的方法的所属的对象是Runnable接口的子类对象。
5.调用Thread类的start方法开启线程并调用Runnable接口子类run方法。