我正在从我的程序中调用一个外部 JAVA 进程。我正在使用该衍生进程生成的输出,如下所示:
DataInputStream dis = new DataInputStream(new BufferedInputStream(myProcess.getInputStream()));
从一个线程我正在执行以下操作:
while (dis.available() != 0)
{
firstMesg = dis.readLine();
if(firstMesg != null)
{
// processing with the message
//System.out.println(firstMesg);
}
}
try
{
Thread.currentThread().sleep(SLEEP_TIME);
}
catch(Throwable e)
{
}
我给 SLEEP_TIME 大约 1 分钟,一切正常。突然,对于一个特定的设置,我发现 Sys out (System.out.println) 从生成的过程中花费了非常长的时间。
谁能指出我发生了什么?这两个过程必须是独立的。然而,调用者正在从被调用的进程中读取数据。但是在被调用的进程正在写入的地方,缓冲区应该很大。因此,它不可能被阻止。
我可以在 ProcessBuilder Java 文档中看到这一点:
父进程使用这些流(#getInputStream()、#getErrorStream())向子进程提供输入并从子进程获取输出。由于一些原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。