我试图通过关闭流来中止已经阻塞的 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。