总结
- AbstractSelectableChannel虚拟类是的多路复用通道SelectableChanne基本实现类
- 此类定义处理通道注册、注销和关闭机制的方法,它保持此通道的当前阻塞模式及其当前选择键集SelectionKey[],它执行实现java.nio.channels.SelectableChannel规范所需的所有同步
- AbstractSelectableChannel虚拟类继承SelectableChannel,SelectableChannel虚拟类可以看我这篇文章 SelectableChannel
AbstractSelectableChannel虚拟类数据结构
public abstract class AbstractSelectableChannel
extends SelectableChannel
{
private final SelectorProvider provider;
private SelectionKey[] keys = null;
private int keyCount = 0;
private final Object keyLock = new Object();
private final Object regLock = new Object();
boolean blocking = true;
}
- SelectorProvider是创建此通道的提供程序
- SelectionKey[] 是该通道向一个或多个选择器注册返回的SelectionKey构成的数组,
- keyCount是该通道拥有的SelectionKey的计数,为什么要有这个呢,因为SelectionKey[] 里面的SelectionKey可能被释放掉了,所以SelectionKey[]数组的长度并不代表SelectionKey总数
- keyLock 是添加、删除、查找SelectionKey需要加上的锁
- regLock 是该通道向选择器注册时和配置该通道的阻塞模式需要加上的锁
- blocking 表示当前通道是否是阻塞模式,阻塞模式的表现和BIO一样,read和write操作需要阻塞,在向选择器注册之前,必须将阻塞模式设为false,表示非阻塞模式
AbstractSelectableChannel虚拟类方法
方法名 | 作用 |
---|
void addKey(SelectionKey k) | 添加从选择器注册该通道返回的SelectionKey到SelectionKey数组中 |
SelectionKey findKey(Selector sel) | 遍历SelectionKey数组寻找该选择器Selector对应的键SelectionKey |
void removeKey(SelectionKey k) | 从SelectionKey数组删除该SelectionKey,并将该SelectionKey注销 |
boolean haveValidKeys() | 判断SelectionKey数组中是否含有有效的SelectionKey |
final boolean isRegistered() | 判断该通道是否向任意选择器Selector注册过 |
final SelectionKey keyFor(Selector sel) | 获取表示通道在给定选择器Selector中注册的密钥SelectionKey |
final SelectionKey register(Selector sel, int ops, Object att) | 在给定选择器上注册此通道,并返回选择键SelectionKey, ops为兴趣集,即该通道感兴趣的事件,如连接建立事件,att是附件,放在SelectionKey中,方便以后取出来使用 |
final void implCloseChannel() | 关闭此通道,close方法调用此方法,以执行关闭通道的实际工作。仅当通道尚未关闭时才调用此方法,并且从未多次调用此方法,此方法的实现必须让在该通道上的I/O操作中被阻塞的任何其他线程立即返回,可以通过引发异常或正常返回 |
abstract void implCloseSelectableChannel() | implCloseChannel()方法内部调用此方法,以实现关闭SelectableChannel多路复用通道 |
final boolean isBlocking() | 判断此通道上是否是阻塞模式,即通道上的每个I/O操作都将阻塞,新创建的通道默认为阻塞模式 |
final Object blockingLock() | 返回关于在选择器上注册通道和设置阻塞模式的锁regLock |
final SelectableChannel configureBlocking(boolean block) | 调整此通道的阻塞模式,如果此通道已向一个或多个选择器注册,则尝试将其置于阻塞模式将导致抛出IllegalBlockingModeException |
abstract void implConfigureBlocking(boolean block) | 调整此通道的阻塞模式的实现方法,上一个方法调用此方法来改变阻塞模式 |