一、线程池
1、基本线程池
描述:
1)从池中的空闲线程列表中选择一个Thread,并且指派它去运行一个已提交的任务(一个Runnable的实现);
2)当任务完成时,将该Thread返回给该列表,使其可被重用
问题:
虽然池化和重用线程相对于简单地为每个任务都创建和销毁线程都是一种进步,但是它并不能消除由上下文切换带来的开销,其将随着数量的增加很快变得明显,并且在高负载下越发严重。
2、Netty线程模型
Reactor模型:
维基百科解释:The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to associated request handlers.
Netty线程模型:
1.Selector
2.EventLoopGroup/EventLoop
3.ChannelPipeline
Selector
selector是java nio提供的SelectableChannel多路复用器,它维护这三个SelectionKey集合,负责配合selector操作将就绪的IO事件分离出来,表现为SelectionKey.在Netty线程模型,Selector充当着多路复用器的作用,而对于SelectionKey理解为Reactor中的资源。
EventLoop/EventLoopGroup
BossEventLoopGroup通常是一个单线程的EventLoop,EventLoop维护着一个注册了ServerSocketChannel的Selector实例,BossEventLoop不断轮询Selector将连接事件分离出来,通常是OP_ACCEPT事件,然后将accept得到的socketChannel交给WorkerEventLoopGroup,WorkerEventLoopGroup会由next选择其中一个EventLoopGroup来将这个SocketChannel注册到其维护的Selector并对其后续的IO事件进行处理。