什么是EventLoop
EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方法处理channel上源源不断的io事件。
什么是EventLoopGroup
EventLoopGroup是一组EventLoop,Channel一般会调用EventLoopgroup的register方法来绑定其中一个EventLoop,后续这个Channel上的io事件都由此EventLoop来处理(保证io事件处理时的线程安全)。
NioEventLoopGroup eventExecutors = new NioEventLoopGroup();
NioEventLoopGroup默认线程数为当前CPU核心数*2;如果有传参则以传参为准。
NioEventLoopGroup支持IO事件,普通任务事件,定时任务事件。
packagenetty.c2; importio.netty.channel.nio.NioEventLoopGroup; importjavafx.scene.layout.GridPane; importjava.util.concurrent.TimeUnit; publicclassTestEventLoop { publicstaticvoidmain(String[] args) { NioEventLoopGroupeventExecutors=newNioEventLoopGroup(2); System.out.println(eventExecutors.next()); System.out.println(eventExecutors.next()); System.out.println(eventExecutors.next()); System.out.println(eventExecutors.next()); // 执行普通任务// eventExecutors.next().submit(() -> {// try {// System.out.println("thread");// Thread.sleep(1000);// } catch (InterruptedException e) {// e.printStackTrace();// }// });// System.out.println("main");// 执行定时任务eventExecutors.next().scheduleAtFixedRate(() -> { try { System.out.println("thread"); Thread.sleep(1000); } catch (InterruptedExceptione) { e.printStackTrace(); } }, 0, 1, TimeUnit.SECONDS); } }
eventLoop和channel进行了绑定。
考虑一个问题:
如果一个work可以绑定多个channel。那么如果某个channel上的handler执行过久,就直接影响work上其他线程的执行时间,怎么处理?
解法:创建一个独立的EventLoopGroup。channel.pipeline().addLast(新的group, "xxx", new ChannelInboundHandlerAdapter(){})。要注意handler的顺序。
剖析:如果两个handler绑定的是同一个线程,那么就直接调用;否则,把要调用的代码封装为一个任务对象,由下一个handler线程来调用(切换线程)。