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(指定线程数量)
