标签:
在Mina的NIO模式中有三种I/O工作线程(这三种线程模型只在NIOSocket中有效,在NIO数据包和虚拟管道中没有,也不需要配置):
一、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()));
五、各种线程的产生
标签:
原文地址:http://www.cnblogs.com/moonandstar08/p/5483605.html