一、概述
在第二节中,分析了NioEventLoopGroup 的构造方法,会调用到父类MultithreadEventExecutorGroup的构造方法,里面有一个很重要的方法children[i] = newChild(executor, args),这个方法被NioEventLoopGroup重写了。这一节就分析一下newChild做了什么。
二、NioEventLoopGroup的newChild方法
protected EventLoop newChild(Executor executor, Object... args) throws Exception {
//executor=new ThreadPerTaskExecutor(newDefaultThreadFactory());
//args参数都是由MultithreadEventExecutorGroup上面传过来的,具体如下
//SelectorProvider用来创建ServerSocketChannel
//DefaultSelectStrategyFactory.INSTANCE===》new DefaultSelectStrategyFactory()
//RejectedExecutionHandlers.reject() ===》 new RejectedExecutionHandler()
return new NioEventLoop(this, executor, (SelectorProvider) args[0],
((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]);
}
NioEventLoop的构造方法。
NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,
SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {
//调用父类的构造方法,主要是将保存 线程组 NioEventLoopGroup
//创建一个21亿的任务队列
//executor负责创建线程执行器也保存起来。
super(parent, executor, false, DEFAULT_MAX_PENDING_TASKS, rejectedExecutionHandler);
/*非主线代码,忽略
if (selectorProvider == null) {
throw new NullPointerException("selectorProvider");
}
if (strategy == null) {
throw new NullPointerException("selectStrategy");
}*/
//provider=SelectorProvider.provider() jdk自带的用来创建ServerSocketChannel
provider = selectorProvider;
//openSelector方法负责将jdk自带的hashSet结构的selectedKeys 也封装成netty自己定义的SelectedSelectionKeySet里面是一个数组结构,这个优化是可以配置的。
final SelectorTuple selectorTuple = openSelector();
//替换了数据结构selectedKeys publicSelectedKeys的原生selector
selector = selectorTuple.</