分类: 云计算
2022-09-27 14:07:12
读入数据逻辑:
IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)
写出数据逻辑:
业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)---IO写出(IoProcessor)
得出结论
由以上可以看出,IO读入和IO写出的过程是相反的。
MINA的线程基本原因
这里主要讨论一下Mina中的线程,使用线程,线程池可以提高性能,Mina中就使用了几种线程:
IoAcceptor/IoConnector线程
IoProcessor线程
IoHandler线程
IoAcceptor/IoConnector 线程介绍
IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:
public NioSocketAcceptor(Executor executor, IoProcessor
public NioSocketConnector(Executor executor, IoProcessor
此类线程池的构造在源代码中为(AbstractIoService第168行):
protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {
//省略部分代码
if (executor == null) {
this.executor = Executors.newCachedThreadPool();
createdExecutor = true;
} else {
this.executor = executor;
createdExecutor = false;
}
}
由此可见默认的线程池类型为newCachedThreadPool,这是一个可根据需要创建新线程的线程池,在以前构造的线程可用时可以重用它们。
IoProcessor 线程介绍
对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小:
IoConnector connector = new NioSocketConnector(9);
IoAcceptor acceptor = new NioSocketAcceptor(9);
如上就把IoProcessor线程池的大小改为9个。
IoProcessor线程池的默认大小在源代码中的定义(SimpleIoProcessorPool第82行):
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
IoProcessor线程池的构造在源代码中为(SimpleIoProcessorPool第144行):
public SimpleIoProcessorPool(Class extends IoProcessor> processorType,
Executor executor, int size) {
//省略部分代码
if (createdExecutor) {
this.executor = Executors.newCachedThreadPool();
} else {
this.executor = executor;
}
}
IoHandler 线程介绍
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么{BANNED}最佳好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
线程是何时被创建的
当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。