在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線程處理業務邏輯。