我的Java程序使用ProcessBuilder(redirectErrorStream设置为true)并且有一个循环来运行进程的inputstream的read方法,该方法是阻塞的。我正在调用的外部程序停止等待输入和stdin。我现在想杀死这个过程。这是不是由(在一个单独的线程中)调用进程的destroy方法,并调用inputstream的close方法来阻止read方法阻塞,以便我的初始线程可以结束它的生命?
由于某种原因process.getInputStream().close()
阻止。从JavaDoc我不明白为什么会发生这种情况。此外,我不明白为什么javadoc说“InputStream的close方法什么都不做”。 (link to javadoc)有人可以解释一下吗?
谢谢: - )
答案 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()非常重要。