在
NioEventLoop
中,Netty
對Selector
作了優化,當使用者沒有禁用優化,而且優化進行順利,會使用SelectedSelectionKeySetSelector
來代替原來的Selector
。git
SelectedSelectionKeySetSelector
內部包含了兩個對象,一個是Netty
自定義的SelectedSelectionKeySet
,另外一個是原來的Selector
。下面具體看下SelectedSelectionKeySet
:github
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
因爲使用的是數組,效率更高。bash
文中帖的代碼註釋全在:KAMIJYOUDOUMA, 有興趣的童鞋能夠關注一下。ide
本篇到此結束,若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【貳級天災】,查閱更多精彩歷史!!! oop