• 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线程处理业务逻辑。
  • 相关阅读:
    利用python 传输文件
    SVN 操作报错 “Previous operation has not finished; run 'cleanup' if it was interrupted“
    Java IP白名单相关工具类
    Truncated class file 问题的解决
    Linux 文件压缩与解压相关
    MyEclipse 根据左括号或右括号查找另外一半
    100个常用的linux命令(转)
    Java 编码规范(转)
    MyEclipse 远程调试Tomcat
    Extjs header column 自定义排序规则
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5483605.html
Copyright © 2020-2023  润新知