暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Netty源码分析(六):SelectedSelectionKeySetSelector

贰级天災 2019-05-27
247

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, 有兴趣的童鞋可以关注一下。


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


文章转载自贰级天災,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论