我试图使用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
是否会使包装的流可以中断?
答案 0 :(得分:0)
是的,差不多。除非流是Channels.newChannel()
,否则ReadableByteChannelImpl
适配器将返回一个FileInputStream
实例;在这种情况下,它将返回FileChannel
,它也是可中断的。
当您获得ReadableByteChannel
时,您已经检查过的代码建议(并且测试确认)底层InputStream
由interrupt()
异步封闭在被阻塞的线程上阅读。
它可能取决于InputStream
的实现,但是核心Java运行时中包含的实现将通过在读取线程中抛出异常来响应异步关闭。异常的具体类型会有所不同。