Netty(2):EventLoop
作者:互联网
EventLoop
EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件。
它的继承关系比较复杂
- 一条线是继承自 j.u.c.ScheduledExecutorService 因此包含了线程池中所有的方法
- 另一条线是继承自 netty 自己的 OrderedEventExecutor,
- 提供了 boolean inEventLoop(Thread thread) 方法判断一个线程是否属于此 EventLoop
- 提供了 parent 方法来看看自己属于哪个 EventLoopGroup
EventLoopGroup
EventLoopGroup 是一组 EventLoop,Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop,后续这个 Channel 上的 io 事件都由此 EventLoop 来处理(保证了 io 事件处理时的线程安全)
- 继承自 netty 自己的 EventExecutorGroup
- 实现了 Iterable 接口提供遍历 EventLoop 的能力
- 另有 next 方法获取集合中下一个 EventLoop
EventLoopGroup 是一组 EventLoop,Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop,后续这个 Channel 上的 io 事件都由此 EventLoop 来处理(保证了 io 事件处理时的线程安全)
- 继承自 netty 自己的 EventExecutorGroup
- 实现了 Iterable 接口提供遍历 EventLoop 的能力
- 另有 next 方法获取集合中下一个 EventLoop
所以我们一般不直接操作EventLoop
,而是通过EventLoopGroup
去获取EventLoop
。
创建EventLoopGroup
并获取EventLoop
//1.创建事件循环组
DefaultEventLoopGroup eventLoopGroup = new DefaultEventLoopGroup(2);//普通任务,定时任务
System.out.println(eventLoopGroup.next());
System.out.println(eventLoopGroup.next());
System.out.println(eventLoopGroup.next());
System.out.println(eventLoopGroup.next());
//默认线程数
// DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
// "io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
NioEventLoopGroup eventExecutors = new NioEventLoopGroup();//io任务,普通任务,定时任务
//执行普通任务
eventExecutors.next().submit(() -> {
System.out.println("abc");
}).get();
//执行定时任务
eventExecutors.next().scheduleAtFixedRate(()-> System.out.println("111"),
1L, 1L, TimeUnit.SECONDS);
测试结果:
标签:Netty,group,EventLoop,System,println,new,EventLoopGroup 来源: https://www.cnblogs.com/wwjj4811/p/16288241.html