《Java并发编程实战》(http://mng.bz/979c)一书中,Brian Goetz和合著者们为线程池大小
的优化提供了很多中肯的建议。这很是重要,若是线程池中线程的数量过多,最终它们会竞争
稀缺的处理器和内存资源,浪费大量的时间在上下文切换上。反之,若是线程的数目过少,正
如你的应用所面临的状况,处理器的一些核可能就没法充分利用。Brian Goetz建议,线程池大
小与处理器的利用率之比可使用下面的公式进行估算:
Nthreads = NCPU * UCPU * (1 + W/C)
其中:
❑NCPU是处理器的核的数目,能够经过Runtime.getRuntime().availableProcessors()获得
❑UCPU是指望的CPU利用率(该值应该介于0和1之间)
❑W/C是等待时间与计算时间的比率编程
好比4核的处理器NCPU是4,你的程序计算一个方法须要5秒钟,整个程序运行也就须要5秒钟,那么W/C比率应该是100,网络
NCPU利用率但愿是100%那么也就是1,整体程序最佳的线程数应该是4*1*(1+100)=404个线程数,但实际操做中,设置404个线程明显不能带来性能的优点,这么多线程数只会增长上下文来回切换带来更严重的性能问题。多线程
若是你的程序是计算密集型的而且没有IO操做,那么建议线程数设置为cpu核数+1,减小上下文切换。并发
若是你的程序是IO密集型的(包括网络链接等待),那么能够按照 Nthreads = NCPU * UCPU * (1 + W/C) 计算线程数.性能