在我们平时的编码过程中,有时候会想到用多线程来提升程序的性能,那么什么时候用多线程,多线程的线程数应该设置为多少比较好,这个就需要根据具体的需求来设置,这里,主要分为CPU密集型和IO密集型的任务。先来介绍以下概念

 

CPU密集型

       CPU密集型会消耗掉大量的CPU资源,例如需要大量的计算,一些复杂运算,逻辑处理之类的。这个时候CPU就卯足了劲在运行,这个时候切换线程,反而浪费了切换的时间,效率不高。

       就像你的大脑是CPU,你本来就在一本心思地写作业,多线程这时候就是要你写会作业,然后立刻敲一会代码,然后在P个图,然后在看个视频,然后再切换回作业。emmmm,过程中你还需要切换(收起来作业,拿出电脑,打开VS…)那你的作业怕是要写到挂科。。。这个时候不太适合使用多线程,你就该一门心思地写作业~

IO密集型

    涉及到网络、磁盘IO的都是IO密集型,这个时候CPU利用率并不高,这个时候适合使用多线程。

    同样以你的大脑为例,IO密集型就是“不烧脑”的工作。例如你需要陪小姐姐或者小哥哥聊天,还需要下载一个VS,还需要看我(黑哥)的博客。这个时候如果使用多线程的话会怎么做?

     咦?小哥哥(小姐姐)给你发消息了,回一下TA,然后呢?TA给你回消息肯定需要时间,这个时候你就可以搜索VS的网站,先下安装包,然后一看,哎呦,TA还没给你回消息,然后看会你黑哥的博客。小哥哥(小姐姐)终于回你了,你回一下TA,接着看我的博客,这就是类似于IO密集型。你可以在不同的“不烧脑”的工作之间切换,来达到更高的效率。而不是小姐姐不回我的信息,我就干等,啥都不干,就等,这个效率可想而知,也许,小姐姐(小哥哥)根本就不会回复你~

多线程的使用和线程数的设置

      开发中我们经常会使用到线程池来处理一些业务,而在不新增设备的情况下,我们所能使用的线程资源又不是无线的,那么高并发、任务执行时间短的业务怎样使用线程池?还有并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

接下来我们进行一一分析:

1:高并发、任务执行时间短的业务,CPU密集型的,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换

2:并发不高、任务执行时间长的业务这就需要区分开看了:

a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务

b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换

(其实从一二可以看出无论并发高不高,对于业务中是否是cou密集还是I/O密集的判断都是需要的当前前提是你需要优化性能的前提下)

3:并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,可以引入三方中间件进行异步操作。