在Java中,确定使用运行时环境创建的进程是否已完成执行?

在Java中,确定使用运行时环境创建的进程是否已完成执行?,第1张

在Java中,确定使用运行时环境创建的进程是否已完成执行?

Process.waitFor()
(javadoc)
应该 可以。如果不起作用,则:

  • JVM或OS中存在错误(这种情况 极不可能 发生),或者

  • 关于该进程和/或您的Java代码的某些信息意味着该进程 不会 退出。


在当前的Java版本中,您也可以使用

Process.isAlive
(javadoc)测试进程状态,而不会阻塞直到进程完成。对于Java
7和更早的版本,有一个hacky解决方案,它需要轮询进程返回代码并捕获异常,但这效率很低。您应该尽快升级到Java 8或更高版本!


任务完成后,将无限期等待。(我不知道为什么)。

如果这个情况发生,则两个

waitFor()
isAlive()
会有所帮助。

从Java启动的进程不会/无法退出的最可能原因是:

  • 该进程被阻塞,等待您的Java应用程序(通过其stdin)为其提供一些输入,

  • 该进程被阻塞,等待您的Java应用程序读取其输出(即,其stdout或stderr),

  • 等待某个外部事件被阻止;例如,如果它试图与没有响应的远程服务器通信,

  • 某些东西向它发送了STOP信号,或者

  • 只是需要很 短的 时间才能运行。

这些原因中的前两个可以通过(分别)关闭连接到其标准输入的Java输出流并读取(并可能丢弃)连接到其标准输出和标准错误的Java输入流来解决。其他原因很棘手,您唯一的选择是“等待”或尝试终止该过程。


底线-您需要找出流程未完成的原因。被阻止的

Process.waitFor()
呼叫是一种症状,而不是疾病。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5135039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存