问题
Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();
#1 热门回答(121 赞)
waitFor()没有返回的原因有很多。
但它通常归结为执行的命令不会退出的事实。
这也可能有很多原因。
一个常见原因是该过程产生一些输出而你没有从适当的流中读取。这意味着一旦缓冲区已满,该进程就会被阻止,并等待你的进程继续读取。你的进程反过来等待其他进程完成(这不会因为它等待你的进程,...)。这是一个典型的僵局。
你需要不断读取进程输入流以确保它不会阻塞。
有一篇很好的文章解释了Runtime.exec()的所有陷阱并展示了他们周围的方法,名为"When Runtime.exec() won't"(是的,文章来自2000,但内容仍然适用!)
#2 热门回答(48 赞)
在等待输出完成之前,你似乎没有读取输出。仅当输出未填充缓冲区时才可以。如果是,它将等到你读取输出catch-22。
也许你有一些你不读的错误。这将使应用程序停止并等待永远等待。解决这个问题的一个简单方法是将错误重定向到常规输出。
ProcessBuilder pb = new ProcessBuilder("tasklist");
pb.redirectErrorStream(true);
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null)
System.out.println("tasklist: " + line);
process.waitFor();
#3 热门回答(32 赞)
也来自Java doc:
java.lang类进程由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞甚至死锁。无法从Process清除输入流的缓冲区(管道到子进程的输出流)可能导致子进程阻塞。
尝试这个:
Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((reader.readLine()) != null) {}
process.waitFor();