process.waitFor() 永不返回

新手上路,请多包涵
Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
    new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();

原文由 user590444 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

waitFor() 没有返回的原因有很多。

但它通常归结为执行的命令没有退出的事实。

同样,这可能有很多原因。

一个常见的原因是进程产生了一些输出,而您没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待您的进程继续读取。您的进程依次等待另一个进程完成(它不会因为它等待您的进程,……)。这是典型的死锁情况。

您需要不断地从进程输入流中读取以确保它不会阻塞。

有一篇很好的文章解释了 Runtime.exec() 的所有陷阱,并展示了解决这些问题的方法,称为 “When Runtime.exec() won’t” (是的,该文章来自 2000 年,但内容仍然适用!)

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

看来您在等待输出完成之前没有阅读输出。仅当输出未填满缓冲区时才可以。如果是,它将等到您读取输出 catch-22。

也许你有一些你没有阅读的错误。这将使应用程序停止并 waitFor 永远等待。一个简单的解决方法是将错误重定向到常规输出。

 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();

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏