【问题标题】:ProcessBuilder and Process.waitFor(), how long does it wait?ProcessBuilder和Process.waitFor(),等了多久?
【发布时间】:2015-04-20 11:13:56
【问题描述】:

我正在使用ProcessBuilder 类和Process 类从java 执行一个.exe 文件。解释我在做什么:

 builder = new ProcessBuilder(commands);
 builder.redirectErrorStream(true);
 Process process = builder.start();
 process.waitFor();

我只是想知道,“waitFor()”要等多久?是等到我的 .exe 执行完毕,还是等到执行完成?

我的 .exe 是经过编译的 AutoIt 脚本。这意味着,可能存在诸如鼠标移动之类的交互,这需要一些时间。 所以我需要知道我的 Java 代码在调用 .exe 后是否继续执行,或者它是否真的在等待它。

我想要实现的是两个脚本的轮换执行,但我担心我的 Java 代码正在执行第二个脚本,而第一个脚本仍在运行。 有没有人解决这个问题?我很高兴有任何想法。

【问题讨论】:

  • 我引用文档:“如果需要,使当前线程等待,直到此 Process 对象表示的进程终止。如果子进程已经终止,则此方法立即返回.”。
  • 看看when-runtime-exec---won-t。对Process.waitFor() 用例有很好的描述。

标签: java process console wait processbuilder


【解决方案1】:

您当前的执行线程将在process.waitFor() 上被阻塞,直到进程终止(即执行完成)。 来源here

还要注意,如果进程已经终止:waitFor() 将不会被阻塞。我不知道你在你的问题中输入的代码是否正是你运行的......但你必须小心并为每次执行脚本重新创建一个新的 Process 实例(即不仅仅是多次调用 start同一个流程:第一次执行后就不行了)

【讨论】:

  • 好的,感谢您给我更多的见解。我不确定文档中如何定义“过程”。我不确定“进程”是指仅执行控制台命令的过程,还是包括它们的完整执行。
【解决方案2】:

另外,如果“命令”中有输出。你应该读取stream(process.getErrorStream())process.getInputStream())的标准输出和标准错误输出。如果没有并且输出或错误输出已满,waitfor()将被挂起。

【讨论】:

    【解决方案3】:

    它将等到过程完成。解决方法:

    1 使用 isAlive()

    2 使用waitFor(long timeout, TimeUnit unit) (仅1.8)

    【讨论】:

    • 谢谢,我会在开发过程中牢记这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2019-04-16
    相关资源
    最近更新 更多