【网络编程】Netty之线程池之NioEventLoopGroup,NioEventLoop
1、服务端绑定端口号,开启seclector,serverSocketChannel,并注册监听连接事件
2、服务端如何消费连接事件
3、服务端如何进行读请求操作
4、服务端如何进行写请求操作
https://blog.csdn.net/star1210644725/article/details/123448306(如何学习源码)
https://blog.csdn.net/star1210644725/article/details/118244777(零拷贝)
一、NioEventLoopGroup (通信线程池)
1、构造函数的核心参数
1、nThreads:指定线程池的个数
2、ThreadFactory: 线程工厂
3、SelectorProvider : selector提供者
4、SelectStrategyFactory:selector的策略工厂
5、Executor : 线程池
6、RejectedExecutionHandler: 拒绝策略
7、EventExecutorChooserFactory:?
2、核心属性
1、EventExecutor[] children : 子线程池
2、Set<EventExecutor> readonlyChildren : 子线程池
3、AtomicInteger terminatedChildren :终止的子线程池的计数器
4、EventExecutorChooserFactory.EventExecutorChooser chooser : 线程池选择器器
5、Promise<?> terminationFuture = new DefaultPromise(GlobalEventExecutor.INSTANCE); ?
二、NioEventLoop(通信线程)
1、构造函数的核心参数
1、NioEventLoopGroup :该线程池从属与那个线程池分组
2、Executor : 线程池
3、SelectorProvider : selector提供者
4、SelectStrategy : select的策略
5、RejectedExecutionHandler: 拒绝策略
2、核心属性
1、Selector selector : 未包装的selector
2、Selector unwrappedSelector : 包装的Selector => io.netty.channel.nio.SelectedSelectionKeySetSelector
3、Queue<Runnable> tailTasks : 末尾任务队列?
4、boolean addTaskWakesUp: 添加任务是否唤醒
5、int maxPendingTasks :最大等待任务
6、Executor executor; 执行任务线程池(一个单线程的线程池)【io.netty.util.concurrent.ThreadPerTaskExecutor】
7、Queue<Runnable> taskQueue; 任务队列? 【服务端启动的时候,会向里添加一个注册向selector注册ServerSocketChannel(先注册的是0,再绑定了端口后,再替换成 监听连接事件)的任务】
8、RejectedExecutionHandler rejectedExecutionHandler; 拒绝策略
9、EventExecutorGroup parent: 父线程池组
10、Promise<?> terminationFuture = new DefaultPromise<Void>(GlobalEventExecutor.INSTANCE); 会向里注册一个监听器。
11、PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue; 调度任务队列?
三、io.netty.channel.DefaultChannelPipeline (通信事件列表)
1、双向链表
final AbstractChannelHandlerContext head 【头节点】 ; (io.netty.channel.ChannelOutboundHandler 实现类)
final AbstractChannelHandlerContext tail 【尾巴节点】; (io.netty.channel.ChannelInboundHandler 实现类)
io.netty.channel.DefaultChannelHandlerContext; 【双向链表的中间节点 - 内部依赖的handler依赖业务自定义的handler(解码,编码,业务处理)】
io.netty.channel.ChannelOutboundHandler
io.netty.channel.ChannelInboundHandler
2、业务自定义的channelHandler:
是该类的 io.netty.channel.ChannelInitializer 匿名类,其处理的handler被放在initChannel()方法的实现里。
其匿名内部类,最终被加在DefaultChannelPipeline的双向链表中
四、io.netty.channel.socket.nio.NioSocketChannel (客户端连接通道)
4.1、核心属性
private final Channel parent; (NioServerSocketChannel)该客户端连接来自对应的NioServerSocketChannel
private final SelectableChannel ch; (java.nio.channels.SocketChannel) 客户端连接对象的原生SocketChannel
private final Unsafe unsafe; (io.netty.channel.socket.nio.NioSocketChannel.NioSocketChannelUnsafe) 读写类
private final DefaultChannelPipeline pipeline; (io.netty.channel.DefaultChannelPipeline) 处理管道 【head <-> 持有ServerBootstrapAcceptor 的 DefaultChannelHandlerContext <-> tail】
private final SocketChannelConfig config; (io.netty.channel.socket.nio.NioSocketChannel.NioSocketChannelConfig) 其关联了原生的Socket 和 NioSocketChannel
五、io.netty.channel.socket.nio.NioServerSocketChannel(服务端连接通道)
5.1、核心属性
private final Channel parent; null
private final SelectableChannel ch; (java.nio.channels.ServerSocketChannel) 客户端连接对象的原生ServerSocketChannel
private final Unsafe unsafe; (io.netty.channel.nio.AbstractNioMessageChannel.NioMessageUnsafe)读写类
private final DefaultChannelPipeline pipeline; (io.netty.channel.DefaultChannelPipeline) 处理管道 【head <-> 可以向ch加入ServerBootstrapAcceptor的 DefaultChannelHandlerContext<-> tail】
private final SocketChannelConfig config; (io.netty.channel.socket.nio.NioServerSocketChannel.NioServerSocketChannelConfig) 其关联了原生的ServerSocket 和 NioServerSocketChannel
private volatile EventLoop eventLoop; 从【监听网络连接的线程池】中获取的一个线程,进行绑定
六、io.netty.bootstrap.ServerBootstrap (服务器程序启动器)
private volatile ChannelHandler childHandler; io.netty.channel.ChannelInitializer类的实现类:自定义的处理通道(编码器,解码器,业务处理类)
volatile EventLoopGroup group; 【监听网络连接的线程池】
private volatile EventLoopGroup childGroup; 【工作线程池】
private final ServerBootstrapConfig config = new ServerBootstrapConfig(this); 服务端的配置类
七、io.netty.bootstrap.ServerBootstrap.ServerBootstrapAcceptor(一类事件的组件)
该类是ChannelInboundHandler 的实现类
7.1、核心属性
private final EventLoopGroup childGroup; 工作线程池
private final ChannelHandler childHandler; 业务自定义的处理器,编码器,解码器,业务处理
private final Entry<ChannelOption<?>, Object>[] childOptions; java原生socketChannel的配置
private final Entry<AttributeKey<?>, Object>[] childAttrs;
private final Runnable enableAutoReadTask; 设置自动读的一个任务