为什么java的inputstream.close()会阻塞?

时间:2009-03-14 23:39:21

标签: java inputstream

我的Java程序使用ProcessBuilder(redirectErrorStream设置为true)并且有一个循环来运行进程的inputstream的read方法,该方法是阻塞的。我正在调用的外部程序停止等待输入和stdin。我现在想杀死这个过程。这是不是由(在一个单独的线程中)调用进程的destroy方法,并调用inputstream的close方法来阻止read方法阻塞,以便我的初始线程可以结束它的生命?

由于某种原因process.getInputStream().close()阻止。从JavaDoc我不明白为什么会发生这种情况。此外,我不明白为什么javadoc说“InputStream的close方法什么都不做”。 (link to javadoc)有人可以解释一下吗?

谢谢: - )

4 个答案:

答案 0 :(得分:4)

关于阻塞行为,Java中存在一个已知问题,当与另一个进程通信时会导致死锁。我不知道这是否是你所看到的,但值得研究。 java.lang.Process的文件说:

  

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

答案 1 :(得分:3)

  

出于某种原因   process.getInputStream()。close()方法   块。从JavaDoc我看不到   为什么会这样。而且,我   不明白为什么javadoc说   “InputStream的close方法确实如此   什么都没有。“(链接到javadoc)可以   有人解释这个吗?

如果你看一下Javadoc,你会发现InputStream是一个抽象类。扩展InputStream的子类应该覆盖close()方法(如果需要)。显然,你正在使用的InputStream子类在close方法中做了一些事情。

答案 2 :(得分:3)

添加到jdigital写的内容,请检查article。它处理Runtime.exec()方法,而ProcessBuilder是在Java 5中引入的,但在我看来,讨论可以推广到系统进程。

答案 3 :(得分:3)

我想我想出来了。显然,在process.getInputStream()。close()和process.getErrorStream()。close()之前调用process.getOutputStream()。close()非常重要。