【发布时间】:2013-10-30 11:03:26
【问题描述】:
我正在从我的程序中调用一个外部 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())向子进程提供输入并从子进程获取输出。因为一些原生平台 只为标准输入和输出流提供有限的缓冲区大小,不能及时写入输入流或读取子进程的输出流可能 导致子进程阻塞,甚至死锁。
【问题讨论】:
-
外部是做什么的?正如
dis.readLine();上的线程块,您必须检查外部进程中发生的情况。 -
我在一个线程上执行此操作并不断检查调用的进程产生了什么。中间有睡眠。
-
我想到了一个外部进程——在你调用它时调用了一个。无论如何,要么您在主应用程序中等待太久而阻塞了外部进程,要么进程在生成输出时遇到了一些麻烦。总而言之,你不应该那样等待,但就像布赖恩写的那样,继续从进程中读取(这个操作会尽可能多地为你阻塞)。获取有关流和流操作的一些信息。
标签: java multithreading process