把书读薄(Netty In Action 第七章)
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一个线程