0
点赞
收藏
分享

微信扫一扫

NioEventLoopGroup源码

吃面多放酱 2022-02-18 阅读 50


整体类图参照


1. thread确定

NioEventLoopGroup() 这样的话,默认是cpu的核数*2
public NioEventLoopGroup() {
this(0);
}


// MultithreadEventLoopGroup类
// 看这里如果thread=0 则默认是DEFAULT_EVENT_LOOP_THREADS
protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);
}



// MultithreadEventLoopGroup类
// 默认是cpu核数*2,当前也可以配置这个属性io.netty.eventLoopThreads
/** cpu核数*2 比如4核=4*2=8 */
private static final int DEFAULT_EVENT_LOOP_THREADS;

static {
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
"io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2)); //availableProcessors=cpu核数*2 比如4核=4*2=8

if (logger.isDebugEnabled()) {
logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
}
}

创建线程池(Acceptor线程、IO线程)

protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
EventExecutorChooserFactory chooserFactory, Object... args) {
if (nThreads <= 0) {
throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
}

if (executor == null) {
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
}
// 某种线程集合 accetpor线程集合 、 io线程集合
children = new EventExecutor[nThreads];

for (int i = 0; i < nThreads; i ++) {
boolean success = false;
try {
children[i] = newChild(executor, args); //创建对象为NioEventLoop
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);
} finally {
if (!success) { // 如果不成功,所有已经实例化的线程优雅关闭
for (int j = 0; j < i; j ++) {
children[j].shutdownGracefully();
}
// 确保已经实例化的线程终止
for (int j = 0; j < i; j ++) {
EventExecutor e = children[j];
try {
while (!e.isTerminated()) {
e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
}
} catch (InterruptedException interrupted) {
// Let the caller handle the interruption.
Thread.currentThread().interrupt();
break;
}
}
}
}
}

}



protected EventLoop newChild(Executor executor, Object... args) throws Exception {
return new NioEventLoop(this, executor, (SelectorProvider) args[0],
((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]);
}





举报

相关推荐

0 条评论