定制的执行器

Dcr 1年前 ⋅ 836 阅读

 

调整线程池大小:

    如果线程池中的线程数量过多,会导致线程竞争稀缺的处理器喝内存资源,浪费大量时间在上下文切换上;反之,处理器的一些核心无法充分利用.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;
      }
});

 

 

全部评论: 0

    我有话说: