在用java socket进行编程的时候,往往对于多个客户端响应的话,一个socket连接创建一个线程或者一个线程处理所有的socket 连接。在netty中是一个EventLoopGroup线程组去处理sokcet连接。我一直不理解的是,在netty中一个channel创建后,是不是也会创建一个线程。如果是的话,客户端增多的话,线程数也会上去。如果不是的话,那这个channel是如何保持的,因为后续会通过这个channel发送消息
在用java socket进行编程的时候,往往对于多个客户端响应的话,一个socket连接创建一个线程或者一个线程处理所有的socket 连接。在netty中是一个EventLoopGroup线程组去处理sokcet连接。我一直不理解的是,在netty中一个channel创建后,是不是也会创建一个线程。如果是的话,客户端增多的话,线程数也会上去。如果不是的话,那这个channel是如何保持的,因为后续会通过这个channel发送消息
当然不是的,你可以先看一下 UNIX网络编程
的第6章IO复用
,具体实现,你可以去理解什么 reactor
模式,==》reactor 模式,在推荐一个pdf文件 nio pdf .
说几点重要的注意点:
1.netty中有一个核心的理念就是减少线程这种消耗资源的操作发生,那么他的策略就是线程来共享。
2. I/o是阻塞操作,所以再用netty默认的线程模型的时候,所有业务都应该快速返回,否则就应该用用户定制的任务执行框架(要在初始化的时候指定) 。
摘抄一下源码:
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
"io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
EventLoop代表一个Thread, EventLoopGroup就是一个EventLoop的容器,里面包含多个EventLoop,其数量就是有初始化参数决定的,见上面的代码。
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
EventLoopGroup
想的太深奥了,EventLoopGroup
接口的继承层次确实有点深,我刚开始看源码时,就发现点击父类,点进去,发现父类还有父类,…… 有点怵。就把它看成是一个线程池就可以了,类比JDBC连接池。bossGroup
就用一个线程来处理远程客户端的连接,workerGroup
拥有的线程数也就2倍的cpu核心数。bossGroup
负责接待,再转交给workerGroup
来处理具体的业务。8
核的,那么上面总共1 + 2*8 = 17
个线程来处理所有的客户端调用。客户端再多也就这么17
个线程来服务。1
秒调用一次直到返回数据。