NioEventLoop源码

5 篇文章 0 订阅
1 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值