请教个java有关问题呀 waitFor()

热爱生活

new Thread(){
void run(){
try{
Process proc = Runtime.getRuntime().exec("ps");
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream());
errorGobbler.start();
outputGobbler.start();

proc.waitFor();
}catch (Exception e){
proc.destroy();
}
}
}.start();

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) {
//空循环
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}

}

为了方便查看,下面是对应截图:

按理说,如果不程序读取proc对应的输入流和错误流,会造成死锁的呀。所以才进行对proc的输入流和错误流读取对应缓冲区。但是为什么 proc.waitFor()没有阻塞等待,直接就往下执行了proc.destroy(),从而造成输入流或错误流读取readLine造成流已经关闭的异常? 谁能解释一下,哪里出了问题呀,谢谢了

strcmp90
太长了,老夫return。

Honey badger don't give a shit.
宝玉
不懂Java,大概看了下,程序到proc.destroy()应该是因为出现异常了!
catch (Exception e){
proc.destroy();
}
你把Exception打印出来看看,例如
catch (Exception e) {
e.printStackTrace();
proc.destroy();
}

早睡早起身体好!
未登录的围观群众
分明是try里就抛出异常才被catch执行destroy。猜下能出问题的估计forwait,导致stream空指针了,把异常日志打印出来看看

[move]_(:3」∠)_[/move]
热爱生活
未登录的围观群众 #4
分明是try里就抛出异常才被catch执行destroy。猜下能出问题的估计forwait,导致stream空指针了,把异常日志打印出来看看
问题是出现在 forWait()没有起到等待阻塞作用,从而直接执行了destroy,导致proc对应的流读取空指针。 但是按照forWait的api说明,应该是等待proc执行完成呀,不知道为什么 proc对应的流操作还没结束,但是proc已经返回了,造成forwait等待结束。
未登录的围观群众
有个问题,Runtime.getRuntime().exec("ps") 后立马获取stream,这时候是否为空?会不会获取在waitfor后面获取?
热爱生活 #5
问题是出现在 forWait()没有起到等待阻塞作用,从而直接执行了destroy,导致proc对应的流读取空指针。 但是按照forWait的api说明,应该是等待proc执行完成呀,不知道为什么 proc对应的流操作还没结束,但是proc已经返回了,造成forwait等待结束。

[move]_(:3」∠)_[/move]