美文网首页多线程专家
IO密集型的线程池大小设置

IO密集型的线程池大小设置

作者: go4it | 来源:发表于2017-07-18 10:50 被阅读1068次

    类型判断(CPU密集orIO密集or混合型)

    看应用是CPU密集型的还是IO密集型的,还是混合型的。

    • CPU密集
      CPU密集型的话,一般配置CPU处理器个数+/-1个线程,所谓CPU密集型就是指系统大部分时间是在做程序正常的计算任务,例如数字运算、赋值、分配内存、内存拷贝、循环、查找、排序等,这些处理都需要CPU来完成。

    • IO密集
      IO密集型的话,是指系统大部分时间在跟I/O交互,而这个时间线程不会占用CPU来处理,即在这个时间范围内,可以由其他线程来使用CPU,因而可以多配置一些线程。

    • 混合型
      混合型的话,是指两者都占有一定的时间。

    IO密集型线程大小

    /**
     * Support class for thread pool size
     * 
     * @author Nadeem Mohammad
     *
     */
    public final class ThreadPoolUtil {
        
        private ThreadPoolUtil() {
            
        }
        /**
         * Each tasks blocks 90% of the time, and works only 10% of its
         *  lifetime. That is, I/O intensive pool
         * @return io intesive Thread pool size
         */
        public static int ioIntesivePoolSize() {
            
            double blockingCoefficient = 0.9;
            return poolSize(blockingCoefficient);
        }
    
        /**
         * 
         * Number of threads = Number of Available Cores / (1 - Blocking
         * Coefficient) where the blocking coefficient is between 0 and 1.
         * 
         * A computation-intensive task has a blocking coefficient of 0, whereas an
         * IO-intensive task has a value close to 1,
         * so we don't have to worry about the value reaching 1.
         *  @param blockingCoefficient the coefficient
         *  @return Thread pool size
         */
        public static int poolSize(double blockingCoefficient) {
            int numberOfCores = Runtime.getRuntime().availableProcessors();
            int poolSize = (int) (numberOfCores / (1 - blockingCoefficient));
            return poolSize;
        }
    }
    

    使用

    ExecutorService executorService = Executors.newFixedThreadPool(ThreadPoolUtil.ioIntesivePoolSize());
    

    这样语义化设置,表达能力强一些。

    doc

    相关文章

      网友评论

        本文标题:IO密集型的线程池大小设置

        本文链接:https://www.haomeiwen.com/subject/mhickxtx.html