gpt4 book ai didi

java - 如何使用 close() 中止阻塞的 process.getInputStream().read()?

转载 作者:行者123 更新时间:2023-11-29 03:28:07 25 4
gpt4 key购买 nike

我试图通过关闭流来中止已经阻塞的 InputStream.read(),但 read() 没有返回。

public static void main(String args[]) throws Exception
{
ProcessBuilder builder = new ProcessBuilder("sleep", "100000");
Process process = builder.start();
final InputStream is = process.getInputStream();

Thread worker = new Thread() {
public void run() {
try {
int data;
while ((data = is.read()) != -1) {
System.out.println("Read:" + data);
}
} catch(IOException e) {
e.printStackTrace();
}
}
};

worker.start();
Thread.sleep(2000);
// process.destroy();
is.close();
worker.join();
}

有没有办法通过关闭流来中止已经阻塞的 read(),而不调用 process.destroy()?

这个问题的背景是一个复杂的 eclipse 插件,大多数时候会通过调用 process.destroy() 来中止阻塞的 BufferedReader.readLine(),但有时 readLine() 不会中止。我怀疑 JVM 内部 ProcessReaper 线程存在某种竞争,我正在尝试通过显式关闭流来解决这个问题。

我正在使用 Linux 和 JDK 1.7.0_25-b15。

最佳答案

老问题,新答案。 NuProcess库为进程实现了非阻塞 I/O,因此您可以完全避免这种情况。

免责声明:我是 NuProcess 的作者。

关于java - 如何使用 close() 中止阻塞的 process.getInputStream().read()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19909217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com