真正实现生成selector的方法是在的NioEventLoopGroup的父类MultithreadEventExecutorGroup中MultithreadEventExecutorGroup(int nThreads, ThreadFactory threadFactory, Object... args)方法
参数:1、nThreads为线程数量,也就是nio中selector的数量,默认为CPU核数*2
(DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)))
2、ThreadFactory 线程工厂
3、args参数,这里的参数主要的是用于生成java nio的Seletor的对象,这个参数我们没有传进去,Netty会自动判断并使用java.nio.channels.spi.SelectorProvider对象;
MultithreadEventExecutorGroup方法中主要的源码:
if (nThreads <= 0) {
throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
}
if (threadFactory == null) {
threadFactory = newDefaultThreadFactory();
}
children = new SingleThreadEventExecutor[nThreads];
for (int i = 0; i < nThreads; i ++) {
boolean success = false;
try {
children[i] = newChild(threadFactory, args);
success = true;
} catch (Exception e) {
// TODO: Think about if this is a good exception type
throw new IllegalStateException("failed to create a child event loop", e);
}
这段代码中最主要的是newChild(threadFactory, args)这句话主要是生成了NioEventLoop对象,NioEventLoop对象调用openSelector方法生成了nio的选择器selector
private Selector openSelector() { final Selector selector; try { selector = provider.openSelector(); } catch (IOException e) { throw new ChannelException("failed to open a new selector", e); } if (DISABLE_KEYSET_OPTIMIZATION) { return selector; } try { SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet(); Class<?> selectorImplClass = Class.forName("sun.nio.ch.SelectorImpl", false, ClassLoader.getSystemClassLoader()); // Ensure the current selector implementation is what we can instrument. if (!selectorImplClass.isAssignableFrom(selector.getClass())) { return selector; } Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys"); Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys"); selectedKeysField.setAccessible(true); publicSelectedKeysField.setAccessible(true); selectedKeysField.set(selector, selectedKeySet); publicSelectedKeysField.set(selector, selectedKeySet); selectedKeys = selectedKeySet; logger.trace("Instrumented an optimized java.util.Set into: {}", selector); } catch (Throwable t) { selectedKeys = null; logger.trace("Failed to instrument an optimized java.util.Set into: {}", selector, t); } return selector; }
其中selector = provider.openSelector()负责生成seletor,这个方法后面的操作主要是通过反射优化Set类型的selectedKeys, publicSelectedKeys,因为在selector中这两个都不是线程安全的(没看selector源码,猜测而以),Netty自己使用实现Set接口SelectedSelectionKeySet代替原来的Set实现,防止在selectedKeys,publicSelectedKeys在读写时出现java.util.ConcurrentModificationException的异常.
最后在绑定端口时,由ServerBootstrap的父类AbstractBootstrap的initAndRegiste方法调用NioEventLoopGroup的register方法将serversocketchannel注册到selector中并开始监听.
相关推荐
一个netty的入门教程以及源码分析视频,适合刚学习的人
美团基础架构部闪电侠老师的netty源码分析视频
netty源码解析PDF,网络编程
Netty4.x源码分析详解
netty4所有的jar包和源码,资源丰富,值得下载。
Netty4.1的源码,欢迎大家下载。.............................................................................................................................................................................
netty4 sources 源码
netty源码
基于EchoServer对Netty4.1源码进行分析,水平有限,如果有问题大家可以提出来共同分享。
netty_learn_netty_源码
netty4.1源码
NETTY架构源码剖析
Netty4&Netty5源码导入Eclipse会报错,原因为缺少Jar包,提提供给爱学习的你!有分给点,没分单密我,白送~
Netty权威指南源码
Netty5.0架构剖析和源码解读.pdf是一本比较全的讲解netty5的书籍,任何对java的nio技术感兴趣的人都值得一看。
NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的客户端接入25 3.2. 客户端创建28 3.2.1. 客户端连接辅助类...
Netty4源码深入剖析(高清视频教程) .rar
Netty权威指南第二版官方源码及netty5源码,
Netty源码分析总结.rar
共分两大章:第1 章:深入浅出Netty源码剖析,第2 章:NIO+Netty5各种RPC架构实战演练,以及课程资料,希望对象学习netty的童靴有用。