ストリームを閉じて、すでにブロックしている 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();
}
process.destroy() を呼び出さずに、ストリームを閉じて既にブロックしている read() を中止する方法はありますか?
この質問の背景には複雑な Eclipse プラグインがあり、ほとんどの場合、ブロックしている BufferedReader.readLine() を process.destroy() を呼び出して中止しますが、readLine() が中止されないことがあります。JVM の内部 ProcessReaper スレッドとの競合が疑われます。ストリームを明示的に閉じることで、競合を回避しようとしています。
Linux と JDK 1.7.0_25-b15 を使用しています。