1 NioEventLoopGroup构造方法调用路径
java1 2 3 4 5 6 7 8 9 10 11
| public NioEventLoopGroup(int nThreads, // 线程池中的线程数 就是NioEventLoop的实例数量 Executor executor, // 本身就要构造一个线程池Executor 现在又传进来一个executor实例 这个实例不是给线程池使用的 而是给NioEventLoop使用的 EventExecutorChooserFactory chooserFactory, // 当提交一个任务到线程池的时候 线程池需要选择其中的一个线程执行这个任务 chooserFactory就是实现选择策略的 SelectorProvider selectorProvider, // SelectorProvider.provider() 通过selectorProvider实例化jdk的Selector 每个线程池都持有一个selectorProvider实例 SelectStrategyFactory selectStrategyFactory, RejectedExecutionHandler rejectedExecutionHandler, EventLoopTaskQueueFactory taskQueueFactory, EventLoopTaskQueueFactory tailTaskQueueFactory ) { super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, rejectedExecutionHandler, taskQueueFactory, tailTaskQueueFactory); }
|
NioEventLoopGroup->MultithreadEventLoopGroup->MultithreadEventExecutorGroup
2 MultithreadEventExecutorGroup构造方法
java1 2 3 4 5
|
private final EventExecutor[] children;
|
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| protected MultithreadEventExecutorGroup(int nThreads, // 标识着group中有几个EventLoop Executor executor, // null EventExecutorChooserFactory chooserFactory, // DefaultEventExecutorChooserFactory.INSTANCE Object... args // [SelectorProvider SelectStrategyFactory RejectedExecutionHandlers] ) {
this.children = new EventExecutor[nThreads];
for (int i = 0; i < nThreads; i ++) { boolean success = false; try {
children[i] = this.newChild(executor, args); success = true; } catch (Exception e) { } finally {
} } }
|
shell1
| the number of threads that will be used by this instance.
|
这些线程将来由NioEventLoopGroup实例使用
- 管理线程的生命周期
- 线程的生控制权不在业务代码,一旦调用start()方法后,随后的调度是由OS的CPU去负责的
- RUNNING之后的状态业务层是可以干预的
- 业务层通过线程这个载体去调度执行任务
3 NioEventLoop实例创建时机
java1 2 3 4 5 6 7 8 9 10 11
|
@Override protected EventLoop newChild(Executor executor, Object... args) throws Exception { }
|
4 组件示意图