当前位置: 首页 > 面试题库 >

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

章盛
2023-03-14
问题内容
Runtime.getRuntime.exex("abc.exe -parameters");

使用.waitFor()无助于确定过程的完成。


问题答案:

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()呼叫是一种症状,而不是疾病。



 类似资料:
  • 问题内容: 有什么方法可以确定进程(脚本)是否在lxc容器(〜Docker运行时)中运行?我知道有些程序能够检测它们是否在虚拟机中运行,是否可以为lxc / docker使用类似的程序? 问题答案: 最可靠的方法是检查。它会告诉您init进程的控制组,并且当您 不在 容器中时,它将用于所有层次结构。当您 在 容器内时,将看到锚点的名称。对于LXC / Docker容器,将分别类似于或。

  • 在Java中,Executor类不像ExecutorService子类那样具有shutdown/shutdownNow()/awaitTermination。因此,如果通过调用executorObject启动任务/线程。execute(runnableTask),如何检查任务是否完成?

  • 问题内容: 我目前正在JAVA中构建一个应用程序,其中只能执行一次。因此,我当前正在使用一个锁定文件,在其中写入当前执行的PID。 因此,只要此应用程序启动,它将打开文件(如果存在)并尝试检测写入文件的PID是否正在实际运行。 这样可以防止我的应用在解锁文件之前崩溃的问题。 我需要它在Windows(XP,7或8)和linux(所有用户都在基于debian的发行版)上工作。 这是一些代码,可以让您

  • 问题内容: 例如,假设我想“提取” 为三个单独的变量,例如: 我该怎么做,而忽略了 “为什么要这么做呢?” 您可能会被问到这个问题。 之前已经多次问过类似的问题,但是从未给出真正的答案,因为OP真正需要的是使用不同的方法。很好,但这有可能吗? 我看过反射,似乎没有任何方法可以使我甚至向实例添加额外的字段,更不用说动态创建本地了。 问题答案: 是否可以在Java运行时创建变量? 简单回答是不。 Ja

  • 我想清除大部分别名定义的PowerShell会话,除了cd、sort、mkdir等常见别名 完成会话后,我希望恢复所有以前已知的别名。 无需卸载模块或注销CmdLets。我只想为我的会话清除别名命名空间。 我可以在如下列表中指定允许的别名: 如何保存和恢复别名? 或 如何启动一个干净的PoSh并只加载基本别名? 以下几行来自我的示例模块。 用法示例: 不幸的是,dir Alias:在调用我的脚本后

  • 在使用TensorFlow Lite库时,有没有办法确保或至少在运行时确定使用了正确的加速器(CPU、GPU)? 尽管我已经按照指南设置了对象在具有GPU(Samsung S9)的设备上使用GPU委托,但在某些情况下很可能使用CPU。例如,如果您使用带有默认委托选项对象的量化模型,它将默认使用CPU,因为设置为false。我几乎可以肯定,即使传递给解释器的选项对象有,但还是使用了CPU。不幸的是,