阅读 491

Netty中的线程处理EventLoop

Netty是用什么来处理线程的?

一般线程池化模式为

  • 从池的空闲任务列表中选择一个Thread,指派它取运行一个已提交的任务
  • 任务完成时,该Thread返回给该列表,使其可以重用

运行任务处理的在编程上的构造通常称作事件循环,Netty使用EventLoop来描述。一个EventLoop将由一个永远不会变的Thread驱动,它可以被指派给多个channel,任务提交给Eventloop之后可以立即执行或者调度执行。任务的执行顺序是以先进先出的顺序执行。

Netty是用什么做任务调度的?

jdk在concurrent包中的ScheduledExecutorService来执行调度,它作为线程管理的一部分,会有额外的线程创建,但是当有大量的任务被紧凑的调度的时候,这有可能成为瓶颈,EventLoop继承了它,而且任务调度不存在这个问题。

要实现延迟执行,只需调用schedule方法即可,要间隔一段时间,每次执行,则调用scheduledAtFixedRate,想要取消调度则是通过返回的scheduledFuture调用cancel

EventLoop的执行逻辑是怎样的?


获取当前的执行线程之后,判断是不是分配给eventLoop的线程,如果是就直接执行,否则放到队列里面稍后执行,这中模式就是Netty线程模式的卓越性,不用关心线程安全和同步相关问题

异步传输和同步传输对eventLoop来讲线程分配有什么不同?

异步传输用的是少量的eventloop,以及与之对应分配的Thread,通过一个线程来支撑多个channel(以此来实现少量线程支撑大量的channel),同步传输则是每个channel一个线程