简单!
全部博文(366)
分类: Java
2012-11-29 15:56:38
Netty网络线程模型主要有两类线程组成:boss线程、worker线程。启动一 个server实例只会产生一个boss线程,boss线程主要负责监听端口,当有新的连接请求时就会产生一个task交给worker线程池处 理,worker线程池中线程的个数默认是cpu个数的2倍。
Netty网络I/O操作采用了目前流行的I/O多路选择器Selector方式(具体的实现是select/poll,还是epoll/kqueue,是由java虚拟机根据具体操作系统的实现来决定的)。
Worker线程池中每个线程都维护几个处理队列(如注册队列,写任务队列等),每个队列中实际上都注册着一些interestOPS(感兴趣的操作 集),worker线程不断的循环地做select操作,boss线程不断地将新的连接请求注册到一个work线程的注册队列中,每次都是轮询出worker线程池中的一个线程:
这里在处理线程间同步和互斥时用了2个锁:
第一个是互斥锁;第二个是读写锁。
每个worker线程各自使用一个selector,即每个worker线程的请求队列中所有的新请求(即一个SocketChannelclient)都会在该worker线程的Selector中注册感兴趣的选择键集。
注:一个Channel对应一个SelectionKey,Selector维护的是所有Channel的SelectionKey,即维护的是一个SelectionKey的集合Set