分享内容如下
- select启动跟踪
- 定时任务机制分析
- NioEventLoopIO轮询方法分析
select启动跟踪
NioEventLoop中有循环select实现,是什么时候被调用的?
循环select由run方法实现,调用链如下图
6
ServerBootstrap(AbstractBootstrap<B,C>).initAndRegister() line: 27
代码如下:
channel.unsafe().register(regFuture);
AbstractNioMessageChannel$NioMessageUnsafe(AbstractChannel$AbstractUnsafe).register(ChannelPromise) line: 396
代码如下:
public final void register(final ChannelPromise promise) {
if (eventLoop.inEventLoop()) {
register0(promise);
} else {
try {//这里的eventLoop 是parentGroup中的
eventLoop.execute(new Runnable() {// 不是直接提交Task,里面有NioEventLoop的启动处理。
@Override
public void run() {
register0(promise);
}
});
} catch (Throwable t) {
//.....省略代码.
}
}
}
NioEventLoop-execute
public void execute(Runnable task) {
if (task == null) {
throw new NullPointerException("task");
}
// 判断调用方是否是当前EventLoop 事件循环执行的线程
boolean inEventLoop = inEventLoop();
if (inEventLoop) {// 线程相同 直接添加任务
addTask(task);
} else {//线程不同
startThread();//第一次执行 启动事件循环
addTask(task);//添加任务
if (isShutdown() && removeTask(task)) {// 如果关闭 移除任务
reject();//执