EventLoop 事件循环对象:
EventLoop
本质是一个单线程执行器(同时维护了一个Selector
),里面有run
方法处理Channel
上源源不断的IO
事件。
EventLoop
的继承关系比较复杂:
- 一条线是继承自
j.u.c.ScheduledExecutorsenvice
因此包合了线程池中所有的方法。 - 另一条线是继承自
Netty
自己的OrderedEventExecutor
(有序的事件处理器),提供了booleaninEventLoop(Threadthread)
方法判断一个线程是否属于此EventLoop
;提供了parent()
方法来着看自己属于哪个EventLoopGroup
。
EventloopGroup 事件循环组:
EventloopGroup
是一组EventLoop
,Channel
一般会调用EventLoopGroup
的register()
方法来绑定其中一EventLoop
,后续这个Channel
上的io
事件都由此EventLoop
来处理(保证了io
事件处理时的线程安全)
EventloopGroup
继承自netty
自己的EventExecutorGroup
实现了Iterable
接口提供遍历EventLoop
的能力;另有next()
方法获取集合中下一个EventLoop
注意:一般情况下我们并不会直接使用EventLoop
而是使用EventloopGroup
事件循环组。
NioEventLoopGroup
:可以执行处理IO
事件,普通任务,定时任务。
new NioEventLoopGroup(指定线程数量)
默认的线程数是指定为0
,然后比较1
和当前系统核心数*2
之间大小,取较大值。如果指定了线程数量那就按照指定的数创建线程。
NettyRuntime.setAvailableProcessors(指定处理器数量);
NettyRuntime.availableProcessors()
如果不进行设置,默认是CPU的处理器数量。处理器数量在默认情况下会动态调整NioEventLoopGroup
创建的线程数量,线程数量对应着EventLoop
对象,一个线程对应一个EventLoop
对象。
调用NioEventLoopGroup
的next()
方法,可以循环的获取分组分组中的EventLoop
对象。
NettyRuntime.availableProcessors()
如果不进行设置,默认是CPU的处理器数量。处理器数量在默认情况下会动态调整NioEventLoopGroup
创建的线程数量,线程数量对应着EventLoop
对象,一个线程对应一个EventLoop
对象。
调用NioEventLoopGroup
的next()
方法,可以循环的获取分组分组中的EventLoop
对象。
// 设置Netty系统的处理器数量: NettyRuntime.setAvailableProcessors(1); // 查看当前Netty处理器数量: System.out.println(NettyRuntime.availableProcessors()); // 创建NioEventLoopGroup对象: NioEventLoopGroup group = new NioEventLoopGroup(); // 使用next获取group中的EventLoop对象: for (int i = 0; i < 4; i++) { System.out.println(group.next());
DefaultEventLoopGroup
:可以执行处理普通任务,定时任务。
new DefaultEventLoopGroup(指定线程数量)