内容简介:前面两部分谈到多线程对内部锁的优化,以及代码中对锁的优化。是从减少竞态的角度来优化程序的。如果从提高线程执行效率,来对多线程程序进行优化,自然让人联想到了线程池技术。Java 线程池会生成一个队列,要执行的任务会被提交到这个队列中。有一定数量的线程会在队列中取任务,然后执行。
前面两部分谈到多线程对内部锁的优化,以及代码中对锁的优化。是从减少竞态的角度来优化程序的。
如果从提高线程执行效率,来对多线程程序进行优化,自然让人联想到了线程池技术。
基本概念与原理
Java 线程池会生成一个队列,要执行的任务会被提交到这个队列中。有一定数量的线程会在队列中取任务,然后执行。
任务执行完毕以后,线程会返回任务队列,等待其他任务并执行。线程池中有一定数量的线程随时待命。
由于生成和维持这些线程是需要耗费资源了,维持太多或者太少的线程都会对系统运行效率造成影响,因此对线程池优化是有意义的。
在做线程池调优之前,先介绍一下线程的几个基本参数,以及线程池运行的原理:
- corePoolSize, 线程池的基本大小,无论是否有任务需要执行,线程池中线程的个数。只有在工作队列占满的情况下,才会创建超出这个数量的线程。
- maximumPoolSize, 线程池中允许存在的最大线程数。
- poolSize, 线程池中线程的数量。
当提交任务需要流程池处理时,会经过以下判断:
- 线程池中的线程数还没有达到基本大小,也就是 poolSize<corePoolSize 时。新增一个线程处理任务,即使线程池中存在空闲的线程。
- 线程池中的线程数大于或等于基本大小,也就是 poolSize>=corePoolSize,并且任务队列未满时,将任务提交到阻塞队列排队等候处理。
-
如果当前线程池的线程数大于或等于基本大小,也就是 poolSize>=corePoolSize 且任务队列占满时,需要分两种情况考虑。
①当 poolSize<maximumPoolSize,新增线程来处理任务;
②当 poolSize=maximumPoolSize,线程池的处理能力达到极限,因此拒绝新增加的任务。
线程池容量配置
从上面线程池原理可以看出,corePoolSize 设置是整个线程池中最关键的参数。
如果设置太小会导致线程池的吞吐量不足,因为新提交的任务需要排队或者被拒绝处理;设置太大可能会耗尽计算机的 CPU 和内存资源。
那么如何配置合理的线程池大小呢?如果将被处理的任务分为,CPU 密集型任务和 IO 密集型任务。前者需要更多 CPU 的运算操作,后者需要更多的 IO 操作。
CPU 密集型任务应配置尽可能小的线程,如配置 CPU 个数 +1 的线程数,IO 密集型任务应配置尽可能多的线程,因为 IO 操作不占用 CPU,不要让 CPU 闲下来,应加大线程数量,如配置两倍 CPU 个数 +1。
CPU 的数字是一个假设,实际环境中需要进行测试,这里给大家一个思路。
若任务对其他系统资源有依赖,如任务依赖数据库返回的结果(IO 操作)。其等待时间越长,CPU 空闲时间就越长,那么线程数量应该越大,才能更好的利用 CPU。
因此在 IO 优化中发现一个估算公式:
最佳线程数目=((线程等待时间+线程 CPU 时间)/线程 CPU 时间 )* CPU 数目。
将公式进一步化简,得到:
最佳线程数目= (线程等待时间与线程 CPU 时间之比+1)* CPU 数目。
因此得到结论:线程等待时间所占比例越高,需要越多线程。线程 CPU 时间所占比例越高,需要越少线程。
从另外一个角度验证上面对 IO 密集型(线程等待时间占比高)和 CPU 密集型(CPU 时间占比高)设置线程池大小的想法。
总结
Java 多线程开发优化有两个思路:
- 针对锁的优化
- 线程池优化
我们从内部锁优化原理入手,分别介绍了锁消除,锁粗化,偏向锁,适应锁,都是以 Java 系统本身来做优化的,作为 程序员 需要了解其实现原理。
针对 Java 代码中锁的优化,我们又提出了,减少临界区范围,减小锁的颗粒度,读写锁(设计模式)等方法。
其中,读写锁只是多线程 设计模式 中的一种,如果有兴趣可以扩展阅读其他的设计模式,协助进行多线程开发。最后针对线程池实现原理,提出了设置线程池大小的思路。
作者:崔皓
简介:十六年开发和架构经验,曾担任过惠普武汉交付中心技术专家,需求分析师,项目经理,后在创业公司担任技术/产品经理。善于学习,乐于分享。目前专注于技术架构与研发管理。
编辑:陶家龙、孙淑娟
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【GPU精粹与Shader编程】(五) 《GPU Gems 2》全书核心内容提炼总结 · 下篇
- 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇
- 利用Azure内容审查器审查违规内容(上) 荐
- 精选内容:developerWorks 上最受欢迎的 Java 内容
- 小帅一点资讯版本更新:返回内容更丰富,增加百科内容
- PingPangChat 内容更新 20200508
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
第二曲线:跨越“S型曲线”的二次增长
[英]查尔斯·汉迪(Charles Handy) / 苗青 / 机械工业出版社 / 2017-6 / 49.00
S型曲线是每个组织和企业在预测未来时一定会参考的工具,一切事物的发展都逃不开S型曲线(“第一曲线”)。 然而,从公司组织、企业治理、市场的变化,到个人职业发展、社会人际关系以及未来的教育与社会价值,多维度地探讨这个世界需要重新以不同的角度来思考问题,不能够总是停留在“第一曲线”的世界。 如果组织和企业能在第一曲线到达巅峰之前,找到带领企业二次腾飞的“第二曲线”,并且第二曲线必须在第一曲......一起来看看 《第二曲线:跨越“S型曲线”的二次增长》 这本书的介绍吧!