java process waitfor_process.waitFor()永远不会返回

问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值