Netty源码分析(六):SelectedSelectionKeySetSelector

NioEventLoop中,NettySelector做了优化,当使用者没有禁用优化,并且优化进行顺利,会使用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, 有兴趣的童鞋可以关注一下。


本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!

猜你喜欢

转载自www.cnblogs.com/YJTZ/p/10853466.html