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对象,指定线程数量为2EventLoopGroup 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@4ec6a292log.info("eventLoop2={}", eventLoop2); //io.netty.channel.nio.NioEventLoop@1b40d5f0log.info("eventLoop3={}", eventLoop3); //io.netty.channel.nio.NioEventLoop@4ec6a292log.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");}
}