ReadableByteChannelImpl如何处理中断

时间:2018-01-24 19:15:13

标签: java

我试图使用Channels.newChannel来包装InputStream以支持中断。我看到了相互矛盾的信息是否有效。在ReadableByteChannelImpl中包含注释:// Not really interruptible

ReadableByteChannelImpl中,在阻止调用InputStream.read之前,调用AbstractInterruptibleChannel.begin,使用Interruptible设置新的sun.misc.SharedSecrets.getJavaLangAccess().blockedOn,这将关闭包裹的InputStream。

protected final void begin() {
    if (interruptor == null) {
        interruptor = new Interruptible() {
                public void interrupt(Thread target) {
                    synchronized (closeLock) {
                        if (!open)
                            return;
                        open = false;
                        interrupted = target;
                        try {
                            AbstractInterruptibleChannel.this.implCloseChannel();
                        } catch (IOException x) { }
                    }
                }};
    }
    blockedOn(interruptor);
    Thread me = Thread.currentThread();
    if (me.isInterrupted())
        interruptor.interrupt(me);
}

如果InputStream从被阻止的读取调用中抛出IOException,如果它被另一个线程关闭,那么ReadableByteChannelImpl是否会使包装的流可以中断?

1 个答案:

答案 0 :(得分:0)

是的,差不多。除非流是Channels.newChannel(),否则ReadableByteChannelImpl适配器将返回一个FileInputStream实例;在这种情况下,它将返回FileChannel,它也是可中断的。

当您获得ReadableByteChannel时,您已经检查过的代码建议(并且测试确认)底层InputStreaminterrupt()异步封闭在被阻塞的线程上阅读。

它可能取决于InputStream的实现,但是核心Java运行时中包含的实现将通过在读取线程中抛出异常来响应异步关闭。异常的具体类型会有所不同。