在程序开发中,常常为了提高性能,我们使用多线程进行开发,而针对多线程常常使用线程池来处理,线程池可以带来很多好处,有兴趣的可以看看之前干货君写的文章:线程池ThreadPool看完这篇就够了
那么现在有个问题来了,在应用中,针对多线程开发,线程数量我们要怎么设置才最合理呢?是不是越多越好?
当然不是,在多线程中,不得不提的上下文切换
上下文切换
首先在单核CPU中,也是可以处理多线程的,只是CPU通过给每个线程分配CPU时间片来处理的,假设我们有A、B两个线程执行任务,CPU在非常短的时间(时间片)执行A线程,然后再执行B线程,如此往复执行,不停的切换(切换时保持之前的状态),由于时间片的间隙非常短,让我们感觉是同时执行的,即多线程,而这种切换就叫上下文切换。
从上面的描述我们可以知道,上下文切换,必然会出现之前的状态保持和启动,必然会导致性能的损耗,因此多线程的数量多就不一定快,也就说明了线程数量不是越多越好。
那么怎么合理的设置线程数量呢?
多线程任务分类
通常针对多线程一般分为两类场景:
IO密集型:IO密集型通常指程序运行期间,大部分的耗时是用来进行I/O操作,而这个时间线程不会占用CPU来处理。
CPU密集型:CPU密集型通常是指系统运行时会消耗掉大量的CPU资源,例如需要大量的计算,一些复杂运算,逻辑处理之类的。
因此针对不同场景线程的数量设置也不一样
I/O密集型
由于系统运行大部分都是在进行I/O交互,并不会暂用cpu资源,因此可以提高线程数,对线程数可以用以下计算公式:
最佳线程数 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU核心数
这样假设线程无等待,最佳线程数 = 1 * CPU核心数,而实际上线程一般都会存在等待时间,可以保守认为等待时间和线程CPU时间一样,即 2 * CPU核心数,因此一般都设置为
最佳线程数 = CPU核心数 * 2
CPU密集型
对于CPU密集型的,绝大部分都是利用cpu资源进行计算,因此一般对于此类场景,最佳线程数量设置为CPU核心线程数+1,以充分利用多核心CPU的处理能力。
最佳线程数 = CPU核心数 + 1
java获取cpu核心数的方法如下:
Runtime.getRuntime().availableProcessors()
用户需要高配置IDC服务器,但因价格昂贵,无法找到合适的IDC服务商提供 服务器租...
为了降低大数据应用开发的门槛,简化开发过程,星环随Transwarp Data Hub 5.0开...
中国的网红经济让一群年轻貌美、有经营头脑的网络红人、KOL走上了致富的道路,而...
昨天三月十四日就是3.14,3.14就是?π,π?就是Pi,Pi就是派,派就是馅饼。俗语...
.icu域名 一年多少钱?. icu域名 的价格,根据 域名 的含义、品相而不同;不同的...
作为一个新员工,一个首要的工作就是阅读别人的代码,阅读代码的诸多好处就不说...
本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划。如果没有,...
Web常用开发工具有哪些?常用工具推荐,IT程序员为了快速、高效地完成任务,会使...
数据分析公司Verisk Analytics的首席信息官Nick Daffan谈谈如何吸引数据科学家,...
stroke属性定义了给定图形元素的外轮廓的颜色。它的默认值是none。 一、属性 1. ...