为什么java中的processBuilder在5分钟后挂起?

Kar*_*yan 3 java deadlock processbuilder

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

而如果过程超过 5 分钟,则该过程会挂起,并且在我退出该过程之前,过程没有任何改进。

p = new ProcessBuilder("myprogram","with","parameter").start();
p.waitFor();
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*uth 5

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

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

Javadocs 说:

上课过程

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

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