目录
字段provider,keys,keyCount,keyLock,regLock,blocking,构造函数
方法provider,addKey,findKey,removeKey,hasValidKeys
方法isRegistered,keyFor,register
方法implCloseChannel,implCloseSelectableChannel
方法isBlocking,blockingLock,configureBlocking,implConfigureBlocking
简介
package java.nio.channels.spi;
import java.io.IOException;
import java.nio.channels.*;
/**
* 可选通道的基本实现类。
*
* <p> 此类定义处理通道注册、取消注册和关闭的机制的方法。
* 它保持该通道当前的阻塞模式及其当前的选择键的集合。
* 它执行了SelectableChannel规范的所有同步。
* 此类中定义的抽象保护方法的实现不需要与可能参与相同操作的其他线程同步。</p>
*
*
* @author Mark Reinhold
* @author Mike McCloskey
* @author JSR-51 Expert Group
* @since 1.4
*/
public abstract class AbstractSelectableChannel
extends SelectableChannel
字段provider,keys,keyCount,keyLock,regLock,blocking,构造函数
// 创建这个通道的提供者
private final SelectorProvider provider;
// 通过向选择器注册此频道而创建的密钥。它们之所以被保存,是因为如果这个通道被关闭,密钥必须被注销。由钥匙锁保护。
private SelectionKey[] keys = null;
private int keyCount = 0;
// Lock for key set and count
private final Object keyLock = new Object();
// Lock for registration and configureBlocking operations
private final Object regLock = new Object();
// Blocking mode, protected by regLock
boolean blocking = true;
/**
* 初始化此类的新实例。
*
* @param provider
* The provider that created this channel
*/
protected AbstractSelectableChannel(SelectorProvider provider) {
this.provider = provider;
}
方法provider,addKey,findKey,removeKey,hasValidKeys
/**
* 返回创建此频道的提供程序。
*
* @return The provider that created this channel
*/
public final SelectorProvider provider() {
return provider;
}
// -- Utility methods for the key set --
private void addKey(SelectionKey k) {
// 确保当前线程持有锁 keyLock
assert Thread.holdsLock(keyLock);
int i =