本文转载自微信公众号《源码学徒》,作者皇甫傲傲鸣。转载本文请联系出处学徒公众号。源码分析上节课我们深入分析了newNioEventLoopGroup();的初始化过程,后来发现NioEventLoopGroup在初始化过程中会构建一个actuator数组,数组里面存放的元素是NioEventLoop类型。但是NioEventLoop是什么?为什么它是Netty的精髓?我们直接去NioEventLoop看看它的构造方法:上节课我们在循环填充actuator数组的过程中创建了它。有关详细信息,请参见上一课,请参阅上一课。false,newTaskQueue(queueFactory),newTaskQueue(queueFactory),rejectedExecutionHandler);this.provider=ObjectUtil.checkNotNull(selectorProvider,"selectorProvider");this.selectStrategy=ObjectUtil.checkNotNull(strategy,"selectStrategy");finalSelectorTupleselectorTuple.Tupleselector=this;选择器;this.unwrappedSelector=selectorTuple.unwrappedSelector;}关于super,后面会跟进,保存selectorproducerthis.provider=ObjectUtil.checkNotNull(selectorProvider,"选择器提供者");绑定了类似于生产者的东西,它允许我们在初始化NioEventLoopGroup时进行初始化。使用此生产者,我们可以稍后获取选择器或套接字通道!2.保存选择器this.selectStrategy=ObjectUtil.checkNotNull(strategy,"selectStrategy");将默认选择策略保存到NioEventLoop对象3.打开一个选择器finalSelectorTupleselectorTuple=openSelector();打开一个selectorwrapper对象,里面包含了一个selector!Netty为了进一步优化Netty的性能,官方也疯狂优化了这个selector。下面我们跟进openSelector这个方法,看看它是如何优化的。内部代码比较复杂。下面逐行分析一下:1.获取原始选择UnwrappedSelector=provider.openSelector();使用原始的生产者对象得到一个原始的选择器,以后再用!2.判断是否启用selector优化//禁用优化选项defaultfalseif(DISABLE_KEY_SET_OPTIMIZATION){//如果不进行优化,则直接包裹原selectorreturnnewSelectorTuple(unwrappedSelector);}DISABLE_KEY_SET_OPTIMIZATION默认为false。当禁用优化时,选择器将直接包装并返回!默认会优化,所以一般不会进入这个逻辑分支!3.获取一个selector类的对象//如果需要优化//反射获取对应类的对象SelectorImplObjectmaybeSelectorImplClass=AccessController.doPrivileged(newPrivilegedAction