Netty源码阅读--EventLoop

-----EventLoop源码分析-----
1)继承图

Executor
  |
  |
  |
....

ScheduledExecutorService
   |
   |
  ....
   |

EventLoop接口              SingleThreadEventExecutor(类)
    SingleThreadEventLoop(单线程的EventLoop)
              NioEventLoop



  (1)ScheduledExecutorService(该接口表示是一个定时任务接口,EventLoop可以接受定时任务);
     1:含有定时任务的队列;

  (2)EventLoop接口: Netty接口文档说明该接口作用: 一旦Channel注册了,就处理该Channel对应的所有IO操作;

  (3)SingleThreadEventExecutor: 标识这是一个单个线程的线程池;
     1:是一个线程池,因为它可以runAllTasks;
     2:可以加任务,加的任务就是事先了Runnable接口逇对象;

  (4)EventLoop是一个单例的线程池,里面含有一个死循环的线程不断的做着3件事情:
      1:3件事情
        监听端口      select: 获取感兴趣的事件
            select如何体现非阻塞的呢?
              说明: 
                  调用selector的select方法,默认阻塞一秒钟,如果有遇定时任务,则在定时任务的基础上再加上0.5s进行阻塞.
                      当执行execute方法的时候,也就是添加任务的时候,会唤醒selector,防止selector阻塞时间过长.

        处理端口事件  processSelectedKeys: 处理事件

        处理队列事件  doAllTasks: 执行队列中的任务

      2:每个EventLoop都可以绑定多个Channel,而每个Channel始终只能由一个EventLoop来处理;


      说明: 在EventLoop里面维护了一个taskQueue(ArrayQueue)

2)NioEventLoop的使用---execute方法
  (1)execute
      1:首先判断该EventLoop的线程是否是当前线程,如果是,直接添加到任务队列中去,
          如果不是,则尝试启动线程(单由于线程是单个的,因此只能启动一次),随后再将任务添加到队列中去;
      2:如果线程已经停止,并且删除任务失败,则执行拒绝策略,默认是抛出异常;
          if(isShutDown() && reoveTask(task)){
            reject();
          }
      3:如果addTaskWakesUp是false,并且任务不是NonWakeupRunnable类型的,就尝试唤醒selector,这
          个时候,阻塞在selector的线程就会理解返回;

3)NioEventLoop的父类SingleThreadEventExecutor的startThread方法:
  (1)当执行execute方法的时候,如果当前线程不是EventLoop所属线程,则尝试启动线程,也就是startThread方法;
  (2)
  (3)


4)EventLoop作为Netty的核心运行机制总结:  
  1)每次执行execute方法都是向任务队列中添加任务,当第一次添加时就会启动线程,执行run方法,而run方法时整个
      EventLoop的核心,就像EventLoop的名字一样,LoopLoop,不停的Loop,Loop做什么呢? 3件事:
        1:调用selector的select方法,默认阻塞1秒钟,如果有定时任务,则在定时任务剩余时间的基础上再加0.5s进行阻塞,
            当执行execute方法的时候,也就是添加任务的时候,会唤醒selector,防止selector阻塞时间过长;
        2:当selector返回的时候,会调用processSelectedKeys方法对selectKey进行处理;
        3:当processSelectedKeys方法执行结束后,则按照ioRatio的比列进行执行runAllTasks方法,默认是IO任务事件和非IO
            任务时间是相同的,你也可以根据你的应用特点进行调优,比如: 非IO任务比较多,那么你就将ioRation调小一点,这样
            非IO任务就能执行的长一点,防止队列中积攒过多的任务;

  2)
  3)

 

你可能感兴趣的:(【netty】)