Netty源码分析(六):SelectedSelectionKeySetSelector
在
NioEventLoop
中,Netty
对Selector
做了优化,当使用者没有禁用优化,并且优化进行顺利,会使用SelectedSelectionKeySetSelector
来代替原来的Selector
。
SelectedSelectionKeySetSelector
SelectedSelectionKeySetSelector
内部包含了两个对象,一个是Netty
自定义的SelectedSelectionKeySet
,另一个是原来的Selector
。下面具体看下SelectedSelectionKeySet
:
SelectedSelectionKeySet
final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> {
/**
* SelectionKey 数组
*/
SelectionKey[] keys;
/**
* 数组可读大小
*/
int size;
SelectedSelectionKeySet() {
keys = new SelectionKey[1024];
}
@Override
public boolean add(SelectionKey o) {
if (o == null) {
return false;
}
keys[size++] = o;
// 当数组占满时,进行扩容
if (size == keys.length) {
increaseCapacity();
}
return true;
}
@Override
public int size() {
return size;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator<SelectionKey> iterator() {
throw new UnsupportedOperationException();
}
void reset() {
reset(0);
}
void reset(int start) {
// 将key数组从start位到size位全置为null
Arrays.fill(keys, start, size, null);
size = 0;
}
/**
* 将数组大小变为原来的2倍
*/
private void increaseCapacity() {
SelectionKey[] newKeys = new SelectionKey[keys.length << 1];
System.arraycopy(keys, 0, newKeys, 0, size);
keys = newKeys;
}
}
SelectedSelectionKeySet
内部很简单,使用数组代替原Selector
的中的HashSet,提高性能。数组默认大小为1024,不够用时容量*2。
NioEventLoop
的processSelectedKeys方法,会根据有没有开启优化来选择不同的遍历方式,优化过的Selector
由于使用的是数组,效率更高。
文中帖的代码注释全在:KAMIJYOUDOUMA, 有兴趣的童鞋可以关注一下。
本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!