zoukankan      html  css  js  c++  java
  • 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线程处理业务逻辑。
  • 相关阅读:
    docker-compose 使用
    mysql UNIX时间戳与日期的相互转换 查询表信息
    mysql查看表结构命令
    PostgreSQL新手入门
    ibdata1是?
    ubuntu 12.04 安装 nginx+php+mysql web服务器
    读懂IL代码就这么简单(二)
    读懂IL代码就这么简单(一)
    在Ubuntu Linux下怎样安装QQ
    jQuery 选择器
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5483605.html
Copyright © 2011-2022 走看看