Apache MINA 线程模型配置

MINA线程模型配置
本文介绍如何在MINA中配置线程模型,包括禁用默认的ThreadModel、设定I/O工作线程数量、添加ExecutorFilter到IoFilterChain中、选择合适的线程池类型等内容。

本文内容是配置基于MINA的应用中的线程模型。
 
1、禁止缺省的ThreadModel设置
       MINA2.0及以后版本已经没有ThreadModel了,如果使用这些版本的话,可以跳过本节。
       ThreadModel设置是在MINA1.0以后引入的,但是使用ThreadModel增加了配置的复杂性,推荐禁止掉缺省的TheadModel配置。
       IoAcceptor acceptor = ...;
       IoServiceConfig acceptorConfig = acceptor.getDefaultConfig();
       acceptorConfig.setThreadModel(ThreadModel.MANUAL);
       注意在相关指南中,假定你已经如本节所说的禁止了ThreadModel的缺省配置。
 
2、配置I/O工作线程的数量
      这节只是NIO实现相关的,NIO数据包以及虚拟机管道等的实现没有这个配置。
      在MINA的NIO实现中,有三种I/O工作线程:
      >>Acceptor线程 接受进入连接,并且转给I/O处理器线程来进行读写操作。每一个SocketAcceptor产生一个Acceptor线程,线程的数目不能配置。
      >>Connector线程 尝试连接远程对等机,并且将成功的连接转给I/O处理器线程来进行读写操作。每一个SocketConnector产生一个Connector线程,这个的数目也不可以配置。
      >>I/O处理器线程 执行实际上的读写操作直到连接关闭。每一个SocketAcceptor或SocketConnector都产生它们自己的I/O处理线程。这个数目可以配置,缺省是1。
       因此,对于每个IoService,可以配置的就是I/O处理线程的数目。下面的代码产生一个有四个I/O处理线程的SocketAcceptor。
       IoAcceptor acceptor = new SocketAcceptor(4, Executors.newCachedThreadPool());
没有单凭经验来决定I/O处理线程数目的方法,大概可以从1开始增加。
       IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
 
3、增加一个ExecutorFilter到IoFilterChain中
       ExecutorFilter 是一个IoFilter,用于将进入的I/O事件转到一个 java.util.concurrent.Executor实现。事件会从这个 Executor转到下一个IoFilter,通常是一个线程池。可以在 IoFilterChain的任何地方增加任意数目的 ExecutorFilter,实现任何类型的线程模型,从简单的线程池到复杂的SEDA。
      到现在为止我们还没有增加 ExecutorFilter,如果没有增加ExecutorFilter,事件会通过方法调用转到一个 IoHandler,这意味着在 IoHandler实现中的业务逻辑会在I/O处理线程里运行。我们叫这种线程模型为"单线程模型"。单线程模型可以用来就会低反应网络应用程序,受 CPU限制的业务逻辑(如,游戏服务器)。
      典型的网络应用需要一个ExecutorFilter插入到IoFilterChain 中,因为业务逻辑和I/O处理线程有不同的资源使用模式。如果你用IoHandler的实现来执行数据库操作,而没有增加一个 ExecutorFilter的话,那么,你整个服务器会在执行数据库操作的时候锁定,特别是数据库性能低的时候。下面的例子配置一个IoService 在一个新的IoSession建立时增加一个ExecutorFilter。
      IoAcceptor acceptor = ...;
      DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
      filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
      这里要注意ExecutorFilter没有管理特定的Executor的生命周期,当完成时,需要关闭所有特定Executor的工作线程。
     ExecutorService executor = ...;
     IoAcceptor acceptor = ...;
     DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
     filterChainBuilder.addLast("threadPool", new ExecutorFilter(executor);
     // Start the server.
     acceptor.bind(...);
    // Shut down the server.
    acceptor.unbind(...);
    executor.shutdown();
    使用一个ExecutorFilter通常不意味着要用一个线程池,对于Executor的实现没有任何限制。
 
4、应该把ExecutorFilter放在IoFilterChain的什么地方
     这 个要根据于具体应用的情况来定。如果一个应用有一个ProtocolCodecFilter实现和一个常用的有数据库操作的IoHandler实现的话, 那么就建议在ProtocolCodecFilter实现的后面增加一个ExecutorFilter,这是因为大部分的协议解码实现的性能特性是受 CPU限制的,和I/O处理线程是一样的。
     IoAcceptor acceptor = ...;
     DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
     // Add CPU-bound job first,
     filterChainBuilder.addLast("codec", new ProtocolCodecFactory(...));
     // and then a thread pool.
     filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
 
5、选择IoService的线程池类型时要小心
     Executors.newCachedThreadPool() 经常是IoService首选的。因为如果使用其它类型的话,可能会对 IoService产生不可预知的性能方面的影响。一旦池中的所有线程都在使用 中,IoService会在向池尝试请求一个线程时开始锁定,然后会出现一个奇怪的性能下降,这有时是很难跟踪的。
 
6、不推荐IoServices和ExecutorFilters共享一个线程池
     你可以想让IoServices和ExecutorFilters共享一个线程池,而不是一家一个。这个是不禁止的,但是会出现很多问题,在这种情况下,除非你为IoServices建立一个缓冲线程池。

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值