java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel
public abstract class AbstractInterruptibleChannel
可中断通道的基本实现类。
此类封装了实现通道异步关闭和中断所需的低级别机制。在调用可能无限期阻塞的 I/O 操作之前和之后,具体的通道类必须分别调用 begin
和 end
方法。为了确保始终能够调用 end
方法,应该在 try ... finally 块中使用这些方法:
boolean completed = false; try { begin(); completed = ...; // Perform blocking I/O operation return ...; // Return result } finally { end(completed); }
end
方法的 completed 参数告知 I/O 操作实际是否已完成,也就是说它是否有任何对调用者可见的效果。例如,在读取字节的操作中,当且仅当确实将某些字节传输到调用者的目标缓冲区时此参数才应该为 true。
具体的通道类还必须实现 implCloseChannel
方法,其方式为:如果调用此方法的同时,另一个线程阻塞在该通道上的本机 I/O 操作中,则该操作将立即返回,要么抛出异常,要么正常返回。如果某个线程被中断,或者异步地关闭了阻塞线程所处的通道,则该通道的 end
方法会抛出相应的异常。
此类执行实现 Channel
规范所需的同步。implCloseChannel
方法的实现不必与其他可能试图关闭通道的线程同步。
构造方法摘要 | |
---|---|
protected |
AbstractInterruptibleChannel() 初始化此类的一个新实例。 |
方法摘要 | |
---|---|
protected void |
begin() 标记可能无限期阻塞的 I/O 操作的开始。 |
void |
close() 关闭此通道。 |
protected void |
end(boolean completed) 标记可能无限期阻塞的 I/O 操作的结尾。 |
protected abstract void |
implCloseChannel() 关闭此通道。 |
boolean |
isOpen() 判断此通道是否处于打开状态。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
protected AbstractInterruptibleChannel()
方法详细信息 |
---|
public final void close() throws IOException
如果已关闭该通道,则此方法立即返回。否则它会将该通道标记为已关闭,然后调用 implCloseChannel
方法以完成关闭操作。
IOException
- 如果发生 I/O 错误
protected abstract void implCloseChannel() throws IOException
为了实际关闭此通道,由 close
方法调用此方法。仅在此通道尚未关闭时才能调用此方法,并且只能调用一次。
此方法的实现必须安排阻塞于此通道上 I/O 操作中的所有其他线程立即返回,要么抛出异常,要么正常返回。
IOException
- 如果关闭通道的同时发生 I/O 错误
public final boolean isOpen()
protected final void begin()
protected final void end(boolean completed) throws AsynchronousCloseException
为了实现此通道的异步关闭和中断,应该使用上面所示的 try ... finally 块先后调用此方法和 begin
方法。
completed
- 当且仅当 I/O 操作成功完成(也就是说该操作产生对其调用者可见的效果)时才为
true
AsynchronousCloseException
- 如果已经异步地关闭了通道
ClosedByInterruptException
- 如果已中断了阻塞在 I/O 操作中的线程