Netty如何使用线程池?

时间:2011-03-29 14:42:33

标签: java netty

您能解释一下Netty如何使用线程池工作吗?我是否理解正确,有两种线程池:老板和工人。 Boss用于执行I / O和worker用于调用用户回调(messageReceived)来处理数据?

2 个答案:

答案 0 :(得分:30)

这是来自NioServerSocketChannelFactory文档

  

一个ServerSocketChannelFactory   创建一个基于服务器端的NIO   ServerSocketChannel实例。它利用了   非阻塞I / O模式   与NIO合作为很多人服务   并发连接数   有效率的。

     

线程如何工作
  有两种类型   的线程   NioServerSocketChannelFactory;一个是   老板线程,另一个是工人   线。

     

Boss线程
  每个约束   ServerSocketChannel有自己的老板   线。例如,如果你打开了两个   服务器端口,如80和443,你   将有两个老板线程。老板   线程接受传入的连接   直到端口未绑定。一旦   连接已成功接受,   老板的线程通过了接受   通道到其中一个工作线程   那个NioServerSocketChannelFactory   管理。

     

工人线程
  一   NioServerSocketChannelFactory可以有   一个或多个工作线程。一位工人   线程执行非阻塞读取和   为一个或多个频道写一个   非阻塞模式。

在Nio模型中,bossThread小心所有有界套接字(listen socket),workerThread小心Accepted-socket(包含IO和callReceived等调用事件方法)。

答案 1 :(得分:14)

与Netty Nio实现(3.2.4.Final)NioServerSocketChannelFactory相关的描述。

工作线程池必须至少能够提供工作线程数(目前默认2 *核心数)。

为什么?

在这种实现的情况下,每个工作者都有自己的选择器循环,这意味着每个工作人员将“吃掉”一个线程在选择器上休眠。此工作者(和相关联的线程)负责执行所有实际的写入和读取(包括管道上的触发事件,这意味着处理程序在该工作线程中执行)。

如果是boss 线程池,实际上线程池是不需要的,因为当前实现只从中获取一个线程。在接受连接向工作者注册的连接之后,该线程大部分时间都在服务器套接字的选择器上休眠。从那一刻起,工人就负责提供这种联系。