分享

MINA2.0线程_笔记

 Bandari_Sky15 2015-04-21
1.线程
使用线程,线程池可以提高性能,MINA中使用的线程如下:
  IoAcceptor/IoConnector线程
        IoProcessor线程
        IoHandler线程

1.1 IoAcceptor/IoConnector线程
IoAcceptor 用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务器端建立连接,每连接一个服务器就建立一个线程。这俩个线程都是通过线程池建立的,我们可以在构造对象的时候就指定线程池类型。
默认的线程池类型为:newCachedThreadPool,这是一个根据需要创建线程的线程池,在以前构造的线程可用时可以重用它们。

1.2 IoProcessor线程
对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小: 

  1. IoConnector connector = new NioSocketConnector(9);  
  2. IoAcceptor acceptor = new NioSocketAcceptor(9);  

1.3 IoHandler线程
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:
  1. acceptor.getFilterChain().addLast("threadPool"new ExecutorFilter(Executors.newCachedThreadPool()));  
如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。 

1.4 各种线程的产生
  • 当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
  • 当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
  • 当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
  • 如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。
  1. public class MinaTest {  
  2.     protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);  
  3.     private static int PORT = 9999;  
  4.   
  5.     public static void main(String[] args) {  
  6.         try {  
  7.             // 创建一个非阻塞的server端的Socket  
  8.             IoAcceptor acceptor = new NioSocketAcceptor();  
  9.             // 设置过滤器  
  10.             acceptor.getFilterChain().addLast("logger"new LoggingFilter());  
  11.             acceptor.getFilterChain().addLast("codec",  
  12.                     new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));  
  13.             acceptor.getFilterChain().addLast("threadPool"new ExecutorFilter(Executors.newCachedThreadPool()));  
  14.             // 设置读取数据的缓冲区大小  
  15.             acceptor.getSessionConfig().setReadBufferSize(2048);  
  16.             // 读写通道10秒内无操作进入空闲状态  
  17.             acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  
  18.             // 绑定逻辑处理器  
  19.             acceptor.setHandler(new MinaServerHandler());  
  20.             // 绑定端口  
  21.             acceptor.bind(new InetSocketAddress(PORT));  
  22.             logger.info("服务端启动成功... 端口号为:" + PORT);  
  23.         } catch (Exception e) {  
  24.             logger.error("服务端启动异常....", e);  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28. }
      
  1. public class MinaServerHandler extends IoHandlerAdapter {  
  2.     protected static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);  
  3.   
  4.     public void exceptionCaught(IoSession session, Throwable cause) throws Exception {  
  5.         logger.error("服务端发送异常...", cause);  
  6.     }  
  7.   
  8.     public void messageReceived(IoSession session, Object message) throws Exception {  
  9.         String msg = message.toString();  
  10.         //如果是quit就关闭session退出    
  11.         if ("quit".equals(msg)) {  
  12.             session.close();  
  13.         }  
  14.         Date date = new Date();  
  15.         session.write(date.toString());  
  16.     }  
  17.   
  18.     public void sessionCreated(IoSession session) throws Exception {  
  19.         logger.info("服务端与客户端创建连接...");  
  20.     }  
  21. }  
  • NioSccketAcceptor为服务器端监听端口9999通过线程池创建的一个线程。
  • NioProcessor-1、NioProcessor-2、NioProcessor-3为IoProcessor线程池创建的线程,用来IO处理。
  • pool-3-thread-1、pool-3-thread-2、pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多