吃透Netty源码系列四之NioEventLoop
新启动的线程的作用
新的线程是个死循环,如果发现有任务的话会执行selectNow(),如果返回0就会开始执行任务,否则没任务就执行选择器的select()方法阻塞,可以看下这个选择策略类,细节后面会讲,先知道为什么开始会执行任务而不是阻塞:

执行NioEventLoop的run方法
线程其实是执行这个方法:

执行具体类NioEventLoop的run(),这个才是真正的任务,省略了大部分东西,把主要的显示出来而来:
@Override
protected void run() {
for (;;) {
select(curDeadlineNanos); //可能会被选择策略延迟,如果有任务的话
processSelectedKeys();
runAllTasks()或者runAllTasks(long timeoutNanos);//执行任务
}
前两个方法暂时不讲,我们就说最后一个runAllTasks,因为开始的时候会先执行前面提交的任务,前两个方法不会执行。那到底是有什么任务呢,其实就是前面提交的一个注册任务:

执行任务一(通道注册register0)
主要是里面的doRegister();
private void register0(ChannelPromise promise) {
try {
...
pipeline.invokeHandlerAddedIfNeeded();//handlerAdded事件
safeSetSuccess(promise);//设置注册成功
pipeline.fireChannelRegistered();//channelRegistered事件
Netty源码解析:NioEventLoop线程执行流程

本文深入剖析Netty中NioEventLoop线程的启动及运行机制,从线程创建到任务执行,包括通道注册、绑定、事件处理等关键步骤,揭示Netty事件驱动模型的核心原理。
最低0.47元/天 解锁文章
1075





