1.線程 使用線程,線程池可以提高性能,MINA中使用的線程如下: IoAcceptor/IoConnector線程 IoProcessor線程 IoHandler線程
1.1 IoAcceptor/IoConnector線程 IoAcceptor 用于監(jiān)聽客戶端的連接,每監(jiān)聽一個(gè)端口建立一個(gè)線程。IoConnector用于與服務(wù)器端建立連接,每連接一個(gè)服務(wù)器就建立一個(gè)線程。這倆個(gè)線程都是通過(guò)線程池建立的,我們可以在構(gòu)造對(duì)象的時(shí)候就指定線程池類型。 默認(rèn)的線程池類型為:newCachedThreadPool,這是一個(gè)根據(jù)需要?jiǎng)?chuàng)建線程的線程池,在以前構(gòu)造的線程可用時(shí)可以重用它們。
1.2 IoProcessor線程 對(duì)于一個(gè)IoAcceptor或IoConnector線程對(duì)應(yīng)一個(gè)IoProcessor線程用于IO的處理,這個(gè)IoProcessor線程從IoProcessor線程池中取出。IoProcessor線程池的大小默認(rèn)為機(jī)器的CPU核數(shù)+1,例如雙核機(jī)器的IoProcessor的線程池大小默認(rèn)為3,我們可以更改線程池的大?。?nbsp; - IoConnector connector = new NioSocketConnector(9);
- IoAcceptor acceptor = new NioSocketAcceptor(9);
1.3 IoHandler線程 當(dāng)我們?cè)谶^(guò)濾器鏈中沒(méi)有添加“threadPool”過(guò)濾器,則業(yè)務(wù)邏輯處理和IoProcessor使用同一個(gè)線程。如果設(shè)置了“threadPool”過(guò)濾器,則使用設(shè)置的線程池產(chǎn)生線程進(jìn)行業(yè)務(wù)邏輯處理,過(guò)濾器的配置如下: - acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
如上配置之后,IO處理和業(yè)務(wù)邏輯處理將會(huì)使用各自的線程池產(chǎn)生線程使用。如果你的應(yīng)用每次處理請(qǐng)求的時(shí)間較長(zhǎng)而又希望應(yīng)用能夠有較好的響應(yīng)性,那么最好是把處理業(yè)務(wù)邏輯的任務(wù)放到一個(gè)新的線程中去執(zhí)行,而不是在 mina 框架創(chuàng)建的線程中去執(zhí)行。 1.4 各種線程的產(chǎn)生 - 當(dāng) IoAcceptor/IoConnector實(shí)例創(chuàng)建的時(shí)候,同時(shí)一個(gè)關(guān)聯(lián)在IoAcceptor/IoConnector上的IoProcessor線程池也被創(chuàng)建。
- 當(dāng)IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被調(diào)用)時(shí),從線程池中取出一個(gè)線程,監(jiān)聽套接字端口。
- 當(dāng) IoAcceptor/IoConnector監(jiān)聽到套接字上有連接請(qǐng)求時(shí),建立IoSession 對(duì)象,從IoProcessor池中取出一個(gè)IoProcessor線程執(zhí)行IO處理。
- 如若過(guò)濾器中配置了“threadPool”過(guò)濾器,則使用此線程池建立線程執(zhí)行業(yè)務(wù)邏輯(IoHandler)處理,否則使用IoProcessor線程處理業(yè)務(wù)邏輯。
- public class MinaTest {
- protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);
- private static int PORT = 9999;
-
- public static void main(String[] args) {
- try {
-
- IoAcceptor acceptor = new NioSocketAcceptor();
-
- acceptor.getFilterChain().addLast("logger", new LoggingFilter());
- acceptor.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
- acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
-
- acceptor.getSessionConfig().setReadBufferSize(2048);
-
- acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
-
- acceptor.setHandler(new MinaServerHandler());
-
- acceptor.bind(new InetSocketAddress(PORT));
- logger.info("服務(wù)端啟動(dòng)成功... 端口號(hào)為:" + PORT);
- } catch (Exception e) {
- logger.error("服務(wù)端啟動(dòng)異常....", e);
- e.printStackTrace();
- }
- }
- }
- public class MinaServerHandler extends IoHandlerAdapter {
- protected static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);
-
- public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
- logger.error("服務(wù)端發(fā)送異常...", cause);
- }
-
- public void messageReceived(IoSession session, Object message) throws Exception {
- String msg = message.toString();
-
- if ("quit".equals(msg)) {
- session.close();
- }
- Date date = new Date();
- session.write(date.toString());
- }
-
- public void sessionCreated(IoSession session) throws Exception {
- logger.info("服務(wù)端與客戶端創(chuàng)建連接...");
- }
- }
- NioSccketAcceptor為服務(wù)器端監(jiān)聽端口9999通過(guò)線程池創(chuàng)建的一個(gè)線程。
- NioProcessor-1、NioProcessor-2、NioProcessor-3為IoProcessor線程池創(chuàng)建的線程,用來(lái)IO處理。
- pool-3-thread-1、pool-3-thread-2、pool-3-thread-3為過(guò)濾器配置的線程池創(chuàng)建的線程,用來(lái)業(yè)務(wù)邏輯處理。
|