Mina的线程模型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mina的线程模型
在Mina的NIO模式中有三种I/O⼯作线程(这三种线程模型只在NIOSocket中有效,在NIO数据包和虚拟管道中没有,也不需要配置):IoAcceptor/IoConnector线程
IoProcessor线程
IoHandler线程
⼀、Acceptor thread
该线程的作⽤是接收客户端的连接,并将客户端的连接导⼊到I/O processor线程模型中。
所谓的I/O processor线程模型就是Mina的I/O processor thread。
Acceptor thread在调⽤了Acceptor.bind()⽅法后启动。
IoAcceptor⽤于监听客户端的连接,每监听⼀个端⼝建⽴⼀个线程。
每个Acceptor只能创建⼀个Acceptor thread,该线程模型不能配置,它由Mina⾃⾝提供。
⼆、Connector thread
该线程模型是客户端的连接线程模型,它的作⽤和Acceptor thread类似,它将客户端与服务器的连接导⼊到I/O processor线程模型中。
IoConnector⽤于与服务端建⽴连接,每连接⼀个服务端就建⽴⼀个线程。
同样地,该线程模型也是由Mina的客户端⾃动创建,该线程模型也不能进⾏配置。
三、I/O processor thread
该线程模型的主要作⽤就⾏接收和发送数据,所有的IO操作在服务器与客户端的连接建⽴后,所有的数据的接收和发送都是有该线程模型来负责的,知道客户端与服务器的连接关闭,该线程模型才停⽌⼯作。
该线程模型可以由程序员根据需要进⾏配置。
该线程模型默认的线程的数量为cpu的核数+1。
若你的cpu为双核的,则你的I/O processor线程的最⼤数量为3,同理若你的若你的cpu为四核的,那么你的I/O processor线程的最⼤数量为5。
由上⾯的内容我们可以知道在Mina中可以配置的线程数量只有I/Oprocessor,对于每个IoService再创建其实例的时候可以配置该IoService的I/Oprocessor的线程数量。
在SokcetConnector和SocketAccpetor中I/OProcessor的数量是由CPU的核数+1来决定的。
配置如下:
/***
*配置SocketAcceptor监听器的I/OProcessor的线程的数量
*此处的I/OProcessor的线程数量由CPU的核数决定,但Acceptor
*的线程数量只有⼀个,也就是接收客户端连接的线程数只有⼀个,
*Acceptor的线程数量不能配置
**/
SocketAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors()+1,Executors.newCachedThreadPool());
/***
*配置SocketConnector监听器的I/OProcessor的线程的数量
*此处的I/OProcessor的线程数量由CPU的核数决定,但SocketConnector
*的线程数量只有⼀个,也就是接收客户端连接的线程数只有⼀个,
*Acceptor的线程数量不能配置
**/
SocketConnector connector= new SocketConnector(Runtime.getRuntime().availableProcessors()+1,Executors.newCachedThreadPool());
四、I/O Handler thread
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使⽤同⼀个线程。
如果设置了“threadPool”过滤器,则使⽤设置的线程池产⽣线程进⾏业务逻辑处理,过滤器的配置如下:
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
五、各种线程的产⽣
当 IoAcceptor/IoConnector实例创建的时候,同时⼀个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
当IoAcceptor/IoConnector建⽴套接字(IoAcceptor 的bind()或者是IoConnector 的connect()⽅法被调⽤)时,从线程池中取出⼀个线程,监听套接字端⼝。
当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建⽴IoSession 对象,从IoProcessor池中取出⼀个IoProcessor线程执⾏IO 处理。
如若过滤器中配置了“threadPool”过滤器,则使⽤此线程池建⽴线程执⾏业务逻辑(IoHandler)处理,否则使⽤IoProcessor线程处理业务逻辑。