【Java】多线程 数目

今天看到一篇文章,讲多线程数目的,很棒:https://juejin.im/post/5cf35e195188252c023f9b72

这个问题还是很容易被忽略的,就是多线程到底是为了什么?

最开始学习多线程的时候,往往将多线程和性能高划等号,只要用了多线程就能提升性能,其实不然。

那么多线程到底应该怎么使用?

上面的文章其实解释的很清楚,多线程是为了让cpu的利用率尽可能高。

首先,任务可以分为cpu密集型和io密集型。

如果多个任务都是cpu密集型的,那么没有必要多线程,如果多线程了反而会降低性能,因为线程切换也会是有开销的。

如果多个任务是io密集型的,那么有必要使用多线程,因为一个任务如果在那做io,cpu其实是空闲的,此时不如让cpu去执行其他的任务,这时多线程才会提高性能。

那么在具体场景中,针对单一任务,如何设置线程数目?

需要做一个假设,一个任务的执行时间=cpu时间+io时间

对于单核,线程数目=1+(io时间/cpu时间)

怎么理解?这个其实是一种理想化的状态,可以这么理解,假设一个任务io时,操作系统总是可以调度到其他需要cpu的任务,那么这个任务的io时间内可以处理的其他任务数目就是io时间/cpu时间个。再加上原本处理这个任务的线程,总数就是这个结果。

如果多核,还需要乘一个核的数目。

这个公式也在文章里有解释。

对于cpu密集型任务,其实只要把线程数设置为核数即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值