继承关系
NioEventLoop的父类有SingleThreadEventLoop,SingleThreadEventExecutor,可见NioEventLoop是一个单线程的组件。在前两个父类中,实现了单线程的任务提交和处理逻辑,并实现诸如runAllTask的方法方便NioEventLoop调用。
从接口上,SingleThreadEventLoop是EventLoop的实现类,而EventLoop实际上十分抽象,可以看做一个可以运行任务的节点。谈谈我的理解,EventLoop实际上需要处理的是网络io的处理,而各种方式的io没法统一抽象。EventLoop从外观上看只是一个任务处理节点,对外很好的封装了它的复杂度。
运行流程
NioEventLoop首先会从NioEventLoopGroup中分配出来,并给予到一个Channel。Channel初始化并将NioEventLoop中的Selector注册到自己这个Channel上。这时NioEventLoop可以正常的接收到这个Channel的各种事件了。
NioEventLoop自启动后就会一直进行select&doTask操作,而他的启动时机是当它收到第一个Task的时候(及Channel的注册任务)。
NioEventLoop首先会进行select操作,获得selector感兴趣的事件,若未获得任何事件,则进行一定时间的阻塞获取(若此时存在任务则直接运行selectNow,保证任务优先)。接着,它将接受到的事件传递给channel,让channel进行进一步处理。接着它将运行一些它队列里的任务,具体运行多长时间则根据之前selector在select上花掉的时间(这样做是为了使网络io与任务分片运行,看起来不卡顿)。