某些输入输出对象(如InputStream
)无法中断,并且在读取,写入过程中无法关闭源。
示例:
class InputStreamOperation1 implements Runnable
{
static InputStream stream;
InputStreamOperation1(InputStream stream) { this.stream = stream; }
public void run()
{
System.out.println("InputStreamOperation - the beginning");
try
{
stream.read(); //blocking operation
} catch (Exception e)
{
System.out.println("InputStreamOperation interrupted");
}
System.out.println("InputStreamOperation - the end");
}
}
试图打断:
ExecutorService executor = Executors.newCachedThreadPool();
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Interrupting InputStream");
f.cancel(true); // Interrupts if running
System.out.println("Interrupt sent to InputStream");
尝试关闭来源
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Closing source in InpuStream");
try
{
System.in.close();
} catch (IOException e)
{
System.out.println("Error during closing InputStreamOperation");
}
System.out.println("Closed source in InputStream");
两种解决方案都无效。在阅读至少一封信后,它会中断或关闭。
我的问题:有没有办法在阻塞操作期间中断阻塞read()
操作或关闭源?
我在这里找到了类似的东西 - Is it possible to read from a InputStream with a timeout?。我想知道是否有任何其他解决方案(特别是中断或关闭源)来停止线程或者唯一的解决方案是以这种棘手的方式连接。
答案 0 :(得分:1)
两种解决方案都无效。在阅读至少一封信后,它会中断或关闭。
我可以关闭System.in
。
我的输出显示:
InputStreamOperation - the beginning
Closing source in InpuStream
Closed source in InputStream
read: -1
InputStreamOperation - the end
我添加了对读取结果的打印,当我在另一个帖子中关闭-1
时,它显示System.in
表示EOF。
我想知道您的问题是否未关闭ExecutorService
?如果不这样做,那么您的申请将无法完成。
ExecutorService executor = Executors.newCachedThreadPool();
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
executor.shutdown();
如果它仍然无效,那么这必须取决于操作系统。它适用于OSX和Linux。
我的问题:有没有办法在阻塞操作期间中断阻塞read()操作或关闭源?
除了关闭一直对我有用的流之外,我知道的另一种方法是使用NIO InterruptibleChannel
类并中断它。
修改强>
从评论中,您在Netbeans下工作,可能是因为安全目的,Web包装器会以某种方式保护System.in
。