netty4源码分析——NioEventLoop

有关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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值