调整线程池大小:
如果线程池中的线程数量过多,会导致线程竞争稀缺的处理器喝内存资源,浪费大量时间在上下文切换上;反之,处理器的一些核心无法充分利用.Brian Goetz建议,线程池大小与处理器的利用率之比可以使用下面的公式进行估算:
N(threads)=N(cpu) * U(cpu) * (1 + W/C)
其中:
N(cpu)是处理器的核的数目,可以通过Runtime.getRuntime().availableProcessors()得到
U(cpu)是期望的CPU利用率(该值应该介于0和1之间)
W/C是等待时间与计算时间的比率
在实际使用执行器时,根据以上公式计算出线程池的线程峰值,结合实际业务需求,为了避免业务需求数据量过多导致服务器超符合而崩溃,需要设置一个上线.比如计算出峰值为400
private final Executor executor = Executors.newFixedThreadPool(Math.min(someThing.size()),400),
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});