netty4源码阅读与分析---netty线程模型

本文主要说下我自己对netty线程模型的理解,以及这样的线程模型的好处。通俗的来讲,netty的线程模型描述的就是老板和员工的故事。老板(通常情况下是一个老板)负责接活,与客户沟通,协调(netty的accept),谈成后(通道建立),他需要从员工中选出一位员工来负责处理后续具体的事宜(worker线程,这里我们有16位员工,编号1-16),员工做事时按照任务的先后顺序进行处理,这样可以避免错乱,这样每一位客户就有唯一对应的员工来处理任务。如果老板接到的活太多了,就有可能一个员工手上有N个客户的活需要干。这样描述应该比较形象了,下面我们画个示例图来表示这样的关系:netty4源码阅读与分析---netty线程模型_第1张图片

NioEventLoop在其中扮演的职责如下:

1,作为acceptor线程,处理客户端的请求接入

2,作为IO线程,监听网络操作将获取到的数据交给业务程序处理

为什么要做这要的设计呢,个人目前想到的有以下几点:

1,将accept事件和其他事件分离出来,通过异步处理的方式可以大大提高性能

2,accept事件是一个非常短暂的过程只需要单线程即可完成工作,如果采用多线程,线程间切换会影响性能,如果多线程轮寻同一个服务端channel,需要处理他们之间的竞争关系。如果这时候一直没有请求进行,线程间的切换是无意义的,白白浪费资源。

3,顺序处理线程的任务队列,可以避免并发问题,简化了线程操作

4,在一个线程中处理I/O事件和处理任务(各占比50%),可以极大提高cpu利用率,但是这也要求程序员特别注意,如果你的业务非常耗时,需要自行建立一个线程池异步执行业务。


你可能感兴趣的:(java,NIO,netty源码阅读与分析)