NIOEVENTLOOP的创建
2019-11-21 11:24
NIOEVENTLOOP的创建
NioEventLoop是netty及其重要的组成部件,它的首要职责就是为注册在它上的channels服务,发现这些channels上发生的新连接、读写等I/O事件,然后将事件转交 channel 流水线处理。使用netty时,我们首先要做的就是创建NioEventLoopGroup,这是一组NioEventLoop的集合,类似线程与线程池。通常,服务端会创建2个group,一个叫做bossGroup,一个叫做workerGroup。bossGroup负责监听绑定的端口,接受请求并创建新连接,初始化后交由workerGroup处理后续IO事件。
NioEventLoop和NioEventLoopGroup的类图
首先看看NioEventLoop和NioEventLoopGroup的类关系图
NioEventLoop
NioEventLoopGroup
类多但不乱,可以发现三个特点:
两者都继承了ExecutorService,从而与线程池建立了联系
NioEventLoop继承的都是SingleThread,NioEventLoop继承的是MultiThread
NioEventLoop还继承了AbstractScheduledEventExecutor,不难猜出这是个和定时任务调度有关的线程池
NioEventLoopGroup的创建
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
我们先看看bossGroup和workerGroup的构造方法。
public NioEventLoopGroup() {
this(0);
}
public NioEventLoopGroup(int nThreads) {
this(nThreads, (Executor) null);
}
除此之外,还有多达8种构造方法,这些构造方法可以指定5种参数:
1、最大线程数量。如果指定为0,那么Netty会将线程数量设置为CPU逻辑处理器数量的2倍
2、线程工厂。要求线程工厂类必须实现java.util.concurrent.ThreadFactory接口。如果没有指定线程工厂,那么默认DefaultThreadFactory。
3、SelectorProvider。如果没有指定SelectorProvider,那么默认的SelectorProvider为SelectorProvider.provider()。
4、SelectStrategyFactory。如果没有指定则默认为DefaultSelectStrategyFactory.INSTANCE
5、RejectedExecutionHandler。拒绝策略处理类,如果这个EventLoopGroup已被关闭,那么之后提交的Runnable任务会默认调用RejectedExecutionHandler的reject方法进行处理。如果没有指定,则默认调用拒绝策略。
最终,NioEventLoopGroup会重载到父类MultiThreadEventExecutorGroup的构造方法上,这里省略了一些健壮性代码。
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,EventExecutorChooserFactory chooserFactory, Object... args) {
// 步骤1
if (executor == null) {
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
}
// 步骤2
children = new EventExecutor[nThreads];
for (int i = 0; i < nThreads; i ++) {
children[i] = newChild(executor, args);
}
// 步骤3
chooser = chooserFactory.newChooser(children);
// 步骤4
final FutureListener