如何合理选配线程池中线程数量

如何合理选配线程池中线程数量

  • CPU核数
  • CPU密集型
  • IO密集型
  • 自定义线程池
  • 参考链接

CPU核数

  • 简介

  • 获取方式

    
        //可以算出核数,例如结果为4就是4核
        System.out.println(Runtime.getRuntime().availableProcessors());
    
    
    

CPU密集型

  • 简介

    CPU密集是指该任务需要大量的运算,而没有阻塞,CPU会一直全速运行(如while循环)

  • 计算公式

    CPU核数 + 1个线程的线程池

  • 注意事项

    CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论开几个模拟的多线程都不可能得到加速,因为CPU总的运算能力就那些,所以对于CPU密集型任务配置尽可能少的线程数量

IO密集型

  • 简介

    指该任务需要大量的IO,即大量的阻塞(如数据库取数据操作)

  • 计算公式

    1. CPU核数 * 2

      由于IO密集型任务线程并不是一直在执行任务,则配置尽可能多的线程

    2. CPU核数/(1-阻塞系数)(阻塞系数在0.8~0.9之间)

      IO密集型时,大部分线程都阻塞,故需要多配制线程数,例如:8核/(1-0.9) = 80个线程数

  • 注意事项

    在单线程上运行IO密集型任务会导致大量的CPU运算能力浪费在等待,所以IO密集型任务中使用多线程可以大大的加速程序运行,即使在单核CPU上,这种加速主要利用了被浪费掉的阻塞时间

自定义线程池

  • 不允许使用Executors创建

    如何合理选配线程池中线程数量_第1张图片

  • 案例代码

    
    
        public static void main(String[] args) {
            // 自定义线程池
            ExecutorService threadPool = new ThreadPoolExecutor(3,
                    5,
                    60,
                    TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(3),
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy());
     
            try {
                for (int i = 0; i < 10; i++) {
                    threadPool.execute(() -> {
                        System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                    });
     
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                threadPool.shutdown();
            }
        }
    
    
    

参考链接

https://blog.csdn.net/weixin_44777693/article/details/95246059

你可能感兴趣的:(Source,Code,Java,Interview)