今天看到一篇文章,讲多线程数目的,很棒
这个问题还是很容易被忽略的,就是多线程到底是为了什么?
最开始学习多线程的时候,往往将多线程和性能高划等号,只要用了多线程就能提升性能,其实不然。
那么多线程到底应该怎么使用?
上面的文章其实解释的很清楚,多线程是为了让cpu的利用率尽可能高。
首先,任务可以分为cpu密集型和io密集型。
如果多个任务都是cpu密集型的,那么没有必要多线程,如果多线程了反而会降低性能,因为线程切换也会是有开销的。
如果多个任务是io密集型的,那么有必要使用多线程,因为一个任务如果在那做io,cpu其实是空闲的,此时不如让cpu去执行其他的任务,这时多线程才会提高性能。
那么在具体场景中,针对单一任务,如何设置线程数目?
需要做一个假设,一个任务的执行时间=cpu时间+io时间
对于单核,线程数目=1+(io时间/cpu时间)
怎么理解?这个其实是一种理想化的状态,可以这么理解,假设一个任务io时,操作系统总是可以调度到其他需要cpu的任务,那么这个任务的io时间内可以处理的其他任务数目就是io时间/cpu时间个。再加上原本处理这个任务的线程,总数就是这个结果。
如果多核,还需要乘一个核的数目。
这个公式也在文章里有解释。
对于cpu密集型任务,其实只要把线程数设置为核数即可。
标签:Java,任务,线程,io,密集型,多线程,数目,cpu From: https://blog.51cto.com/u_15873544/5844095