7

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

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

谢谢 :-)

4

4 回答 4

4

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

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

于 2009-03-14T23:57:40.087 回答
3

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

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

于 2009-03-14T23:50:01.277 回答
3

添加到 jdigital 写的内容,查看这篇文章。它处理Runtime.exec()方法,并ProcessBuilder在 Java 5 中引入,但在我看来,讨论可以推广到一般的系统进程。

于 2009-03-15T00:10:48.667 回答
3

我想我想通了。显然,在 process.getInputStream().close() 和 process.getErrorStream().close() 之前调用 process.getOutputStream().close() 很重要。

于 2009-03-15T11:35:44.107 回答