http://www.lai18.com/content/1473738.html
有关NioEventLoop的继承结构如下图:
NioEventLoop是Netty的Reactor线程,它的职责如下:
1. 作为服务端Acceptor线程,负责处理客户端的请求接入;
2. 作为客户端Connecor线程,负责注册监听连接操作位,用于判断异步连接结果;
3. 作为IO线程,监听网络读操作位,负责从SocketChannel中读取报文;
4. 作为IO线程,负责向SocketChannel写入报文发送给对方,如果发生写半包,会自动注册监听写事件,用于后续继续发送半包数据,直到数据全部发送完成;
5. 作为定时任务线程,可以执行定时任务,例如链路空闲检测和发送心跳消息等;
6. 作为线程执行器可以执行普通的任务线程(Runnable)。
线程的创建是在singleThreadEventExecutor中实现的:
NioEventLoop.execute()的实现是在其祖父类中实现的
//SingleThreadEventExecutor
StartThread()启动内部线程同时自己加一个定时清理的定时任务。 SingleThreadEventExecutor内部一个类PurgeTask重写了runnable的run(),
nioEventloop.run()是netty最为主要的一个函数之一,负责执行时间的分配和任务的调度
NioEventLoop.run()
processSelectedKeys()代码:
实际上flip()是实现有无活动keys的检测和分流:
这个方法实际上是将selectKeys[]非null即有活动的key取出,并采用processSelectedKey()方法处理。因此IO任务最终会执行processSelectedKey()
该函数实质是对flag进行switch执行不同的任务。如read()
接着执行非IO任务。runAllTasks()执行非IO任务。Netty为了尽可能的不使用线程锁,将非IO任务统一封装成Task投放到worker线程池中,以提升效率。nioEventLoopGroup.runAllTasks():方法直接继承为SingleThreadEventExecutor