近期业务需要所引发的性能优化问题,浅谈线程池性能优化
线程池对于性能优化无处不在
1.楼主在平时产品开发过程中所遇到的性能问题,特别是最近特别流行的微服务架构、
web - java - 底层数据源(python亦或者opensatck),对于这种前后台分离的场景
无时无刻会存在对于业务场景需要对同一数据源进行百次,千次的重复调用过程、
性能方面就会出现接口延迟,过慢,超时等情况
下面就楼主最近遇到的一个业务场景加以举例说明:做云计算相关的想必都是知道,我们在为客户提供单板的过程中(也就是物理机);会对众多的单板进行管理,这里我们就引进主机组;
主机组就是用来管理单板的存在,往往在使用过程中,会存在资源不足的情况,我们此时就需要将资源不足的单板迁移到别的主机组上,从而做到虚拟机资源的合理利用,对此在迁移过程
中可能能会出现成败上前的主机批量操作,对此串行显然已经不能满足我们的诉求了,此时就要引进线程池
2.线程池在该高并发场景下的使用来提高性能
首先说下线程池中几个重要的类
1、newFixedThreadPool创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
2、newCachedThreadPool创建一个可缓存的线程池。这种类型的线程池特点是:
1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
3、newSingleThreadExecutor创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。
4、newScheduleThreadPool创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer
楼主以newFixedThreadPool的方式为主简单测试下效果:
首先是传统for循环串行时,
处理10000条数据,每次业务处理假设消耗10ms,总用时107857ms
下面使用线程池为size为100的,处理10000条数据总用时1100ms,有没有很神奇,效率接近10倍
至此,楼主要说的线程池处理海量数据,或者高并发时简单应用告一段落。。。。。
类似于这种线程池工具类,论坛有很多,大家可以参考~~~~
如有不对之处,望指正啦