EventLoop
是一个单线程的执行器(同时维护了一个Selector),里面有run方法处理Channel上源源不断的io事件。
1.继承java.util.concurrent.ScheduledExecutorService因此包含了线程池中所有的方法。
2.继承netty自己的OrderedEventExecutor
EventLoopGroup
一般不会直接使用EventLoop,而是使用EventLoopGroup。
Channel一般会调用EventLoopGroup的register方法来绑定其中一个EventLoop,后续这个channel上的io事件都由这个EventLoop来处理(保证io事件处理时的线程安全)。
NioEventLoopGroup 与 DefaultEventLoopGroup的区别
EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup();// 处理io事件、定时任务、普通任务 DefaultEventLoopGroup defaultEventLoopGroup = new DefaultEventLoopGroup(); // 定时任务、普通任务
new NioEventLoopGroup() 跟踪源码:
可以看出默认创建的线程数= 电脑cpu核数 x 2
@Slf4j
public class EventLoopGroupDemo {
public static void main(String[] args) {
//创建EventLoopGroup对象,指定线程数量为2
EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(2);// 处理io事件、定时任务、普通任务
// DefaultEventLoopGroup defaultEventLoopGroup = new DefaultEventLoopGroup(); // 定时任务、普通任务
//获取下一个eventLoop对象
EventLoop eventLoop1 = nioEventLoopGroup.next();
EventLoop eventLoop2 = nioEventLoopGroup.next();
EventLoop eventLoop3 = nioEventLoopGroup.next();
EventLoop eventLoop4 = nioEventLoopGroup.next();
//只有两个对象,就会循环获取,获取四次,两两相同,看对象的hashcode值
log.info("eventLoop1={}", eventLoop1); //io.netty.channel.nio.NioEventLoop@4ec6a292
log.info("eventLoop2={}", eventLoop2); //io.netty.channel.nio.NioEventLoop@1b40d5f0
log.info("eventLoop3={}", eventLoop3); //io.netty.channel.nio.NioEventLoop@4ec6a292
log.info("eventLoop4={}", eventLoop4); //io.netty.channel.nio.NioEventLoop@1b40d5f0
//把一个普通任务提交给EventLoopGroup中某一个EventLoop去执行,异步执行
//应用场景:
// 1.如果当前线程的某个任务比较耗时,可以交给EventLoopGroup中的其他线程进行异步处理。
// 2.任务从一个线程的执行权转到另一个线程。
nioEventLoopGroup.execute(() ->{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//[nioEventLoopGroup-2-1] INFO com.xkj.org.netty.EventLoopGroupDemo - execute common task ok
//nioEventLoopGroup-2-1 就是 EventLoopGroup中一个EventGroup线程的名字
log.info("execute common task ok");
});
//执行定时任务
//1s后执行,间隔2s执行一次
nioEventLoopGroup.scheduleAtFixedRate(() -> {
// [nioEventLoopGroup-2-2] INFO com.xkj.org.netty.EventLoopGroupDemo - ok
// nioEventLoopGroup-2-2就是 EventLoopGroup中一个EventGroup线程的名字
log.info("ok");
}, 1, 2, TimeUnit.SECONDS);
log.info("main");
}
}