InputStream - 关闭,中断阻塞read()

时间:2013-11-19 19:48:15

标签: java netbeans concurrency io

某些输入输出对象(如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?。我想知道是否有任何其他解决方案(特别是中断或关闭源)来停止线程或者唯一的解决方案是以这种棘手的方式连接。

1 个答案:

答案 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