文章目录
- 一、EventLoop
- 1、EventLoop
- 2、EventLoopGroup
- (1)处理普通时间和定时任务
- (2)处理IO任务
- 二、Channel
- 三、Future&Promise
- 四、Handler&Pipeline
- 五、ByteBuf
一、EventLoop
1、EventLoop
EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方法处理Channel上源源不断地IO事件。
它的继承关系比较复杂:
- 继承自j.u.c.ScheduledExecutorService因此包含了线程池中所有的方法。
- 另一条线是继承自netty自己的OrderedEventExecutor。
package io.netty.channel;import io.netty.util.concurrent.OrderedEventExecutor;public interface EventLoop extends OrderedEventExecutor, EventLoopGroup {EventLoopGroup parent();
}
2、EventLoopGroup
EventLoopGroup是一组EventLoop,Channel一般会调用EventLoopGroup的register方法来绑定其中一个EventLoop,后续这个Channel上的IO事件都由此EventLoop来处理(保证了IO事件处理时的线程安全)。继承自netty自己的EventLoopGroup:
- 实现了Iterable接口提供遍历EventLoop的能力。
- 另外提供了next方法获取集合中下一个EventLoop。
(1)处理普通时间和定时任务
package cn.itcast.netty.c3;import io.netty.channel.DefaultEventLoopGroup;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.NettyRuntime;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;@Slf4j
public class TestEventLoop {public static void main(String[] args) {// 1. 创建事件循环组EventLoopGroup group = new NioEventLoopGroup(2); // io 事件,普通任务,定时任务
// EventLoopGroup group = new DefaultEventLoopGroup(); // 普通任务,定时任务// 2. 获取下一个事件循环对象System.out.println(group.next());System.out.println(group.next());System.out.println(group.next());System.out.println(group.next());// 3. 执行普通任务/*group.next().execute(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("ok");});*/// 4. 执行定时任务group.next().scheduleAtFixedRate(() -> {log.debug("ok");}, 0, 1, TimeUnit.SECONDS);log.debug("main");}
}