总结
- AbstractInterruptibleChannel虚拟类是可中断通道的基本实现类(模板方法类)
- AbstractInterruptibleChannel虚拟类封装了实现通道异步关闭和中断所需的小型框架,具体的通道类必须在调用可能无限期阻塞的I/O操作之前和之后分别调用begin和end方法。为了确保始终调用end方法,应在try finally块中使用这些方法
- 使用示例
boolean completed = false;
try {
begin();
completed = ...;
return ...;
} finally {
end(completed);
}
- end方法的completed参数说明I/O操作是否实际完成,也就是说,它是否有任何对调用程序可见的效果。例如,对于读取字节的操作,当且仅当某些字节实际传输到调用程序的目标缓冲区时,此参数应为true
- 具体的通道类还必须实现implCloseChannel方法,如果在通道上的本机I/O操作中阻塞另一个线程时调用该方法,则该操作将立即返回,方法是引发异常或正常返回。如果一个线程被中断,或者阻塞它的通道被异步关闭,那么通道的end方法将抛出相应的异常
- 此类的close方法实现了java.nio.channels.Channel规范所需的同步, implCloseChannel方法的实现不需要与可能试图关闭通道的其他线程同步
AbstractInterruptibleChannel虚拟类方法
方法名 | 作用 |
---|
final void close() | 关闭此通道,如果通道已关闭,则此方法立即返回。否则,它会将通道标记为关闭,然后调用implCloseChannel方法以完成关闭操作 |
abstract void implCloseChannel() | 关闭此通道,close方法调用此方法,以执行关闭通道的实际工作。仅当通道尚未关闭时才调用此方法,并且从未多次调用此方法,此方法的实现必须让在该通道上的I/O操作中被阻塞的任何其他线程立即返回,可以通过引发异常或正常返回 |
final boolean isOpen() | 判断通道是否打开 |
final void begin() | 标记可能无限期阻塞的I/O操作的开始,此方法应与end方法一起调用,使用try finally块, 以实现此通道的异步关闭和中断 |
final void end(boolean completed) | 标记可能无限期阻塞的I/O操作的结束,completed为 true 表示I/O操作成功完成 |