netty服务运行一段时间无响应_一个终极思考:为何Netty用单线程执行多个Channel上的任务和I/O事件?...

2b438222c551b7fa5c96caad76cc22d3.png

ce9d0a53b4596e50210ca74ed082e30a.png

点击上方蓝字关注我吧!

本篇文章大概3200字,阅读时间大约10分钟

本文概括性的总结了Netty的NioEventLoop组件的事件循环机制设计思想和这种设计的必要性,并且类比到Redis组件,做到举一反三。同时,本篇文章也是对前面线程图像的一个总结。

b0fee9047a98f444b90b50fd1e59a19d.gif

前面花费了数篇文章,细致的拆解了Netty的线程图像,异步图像和流水线图像,现在做一个小结,即Netty为何要用单线程去做那么多的事情,包括了I/O事件轮询,处理并传播I/O事件,这里就对应到了流水线图像,还有异步任务的抽空执行策略,这里面也包含了定时任务。其实同样的问题可以套用在Redis,要知道Redis的事件循环机制也是单线程的。

我将其原因分了两类,一类是JDK的NIO本身的约束,一类是在设计上需要考虑的因素。

先看第一类,即NIO本身在实现和设计上有一些限制。前面总结过NIO的channel.register(Selector,I/O事件,附加对象)方法,它会给当前Channel注册感兴趣的I/O事件,以及I/O多路复用器等资源,并返回一个SelectionKey对象,这个SelectionKey是Channel和I/O多路复用器已经成功绑定的唯一标记,示意图如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值