Netty源碼分析(六):SelectedSelectionKeySetSelector

NioEventLoop中,NettySelector作了優化,當使用者沒有禁用優化,而且優化進行順利,會使用SelectedSelectionKeySetSelector來代替原來的Selectorgit

SelectedSelectionKeySetSelector

SelectedSelectionKeySetSelector內部包含了兩個對象,一個是Netty自定義的SelectedSelectionKeySet,另外一個是原來的Selector。下面具體看下SelectedSelectionKeySetgithub

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因爲使用的是數組,效率更高。bash

文中帖的代碼註釋全在:KAMIJYOUDOUMA, 有興趣的童鞋能夠關注一下。ide


本篇到此結束,若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【貳級天災】,查閱更多精彩歷史!!! oop

相關文章
相關標籤/搜索