ThreadPoolTask​​Executor中corePoolSize和maxPoolSize的理想值应该是多少

时间:2019-01-04 12:17:18

标签: java multithreading spring-boot multiprocessing threadpool

当我们每秒收到200个请求,并且线程之间的资源没有任何依赖性时。

我们目前正在使用以下代码

@Bean
    public ThreadPoolTaskExecutor getTaskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        int maxPoolSize = 1;
        if(Runtime.getRuntime().availableProcessors()-4>1){
            maxPoolSize = Runtime.getRuntime().availableProcessors()-4;
        }
        taskExecutor.setMaxPoolSize(maxPoolSize);
        System.out.println("Thread pool size SaveThread : "+taskExecutor.getMaxPoolSize());
        taskExecutor.setDaemon(true);
        taskExecutor.setThreadNamePrefix("SaveThread-");
        taskExecutor.initialize();
      return taskExecutor;
     }

1 个答案:

答案 0 :(得分:1)

对于粗略估计,您可以考虑以下公式:

  

线程数=(请求处理时间毫秒/ 1000)*   number_of_request_to_handle

示例:您在30毫秒内处理请求。要处理200个请求/秒,您需要大约6个线程+一些缓冲区。

您还需要考虑:

  • 此解决方案不能线性扩展(因为context switching
  • 处理请求时间的分配(统计)
  • gc暂停
  • 机器上的其他进程

最好的方法是设置从软件未运行的其他计算机执行的一些性能测试。