【问题标题】:Why processBuilder in java hangs after 5 mins?为什么java中的processBuilder在5分钟后挂起?
【发布时间】:2016-06-29 11:40:09
【问题描述】:

我有一个处理超过 5 分钟的命令行。当我使用 ProcessBuilder 调用命令行时,它会在 5 分钟内完成该命令。

而如果需要超过 5 分钟,进程就会挂起,并且在我退出进程之前不会显示进程的任何改进。

p = new ProcessBuilder("myprogram","with","parameter").start();
p.waitFor();

如果您不明白上述问题,请告诉我?

【问题讨论】:

  • @Matej Kormuth 的回答是正确的。您应该注意与进程关联的标准文件描述符。解决此问题的最简单方法是(对于初学者)p = new ProcessBuilder("myprogram","with","parameter").inheritIO().start(); 假设您使用的是 Java 7+。

标签: java deadlock processbuilder


【解决方案1】:

问题可能是,命令“myprogram”产生了一些输出,而您没有阅读它。这意味着一旦缓冲区已满,该进程就会被阻止并等待您的进程继续读取。您的进程反过来等待另一个进程完成(它不会因为它等待您的进程,...)。这是典型的死锁情况。

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

Javadocs 说:

上课过程

因为一些原生平台只提供有限的缓冲区大小 标准输入输出流,未能及时写入输入 流或读取子进程的输出流可能会导致 子进程阻塞,甚至死锁。

未能清除输入流的缓冲区(通过管道连接到输出 来自 Process 的子进程流)可能导致子进程阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 2020-11-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多