Java 其他多线程框架中的理想线程池大小

Java 其他多线程框架中的理想线程池大小,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我正在使用一个多线程框架(ApacheTomcat),并且 编写我自己的服务(在资源中),该服务使用固定的线程池大小(JavaExecutorService)来运行其任务 如何确定与框架或其他服务池相关的理想池大小?如果不在具有代表性工作负载的生产环境(在生产硬件等上)的web容器中运行应用程序,则无法确定“理想”池大小 换句话说,将池大小设置为配置参数并对其进行调优 如果您的应用程序在同一web容器中运行多个应用程序,则需要将它们一起调优 我没有给出明确的建议或公式的原因是,最佳池大小在很大

我正在使用一个多线程框架(ApacheTomcat),并且 编写我自己的服务(在资源中),该服务使用固定的线程池大小(Java
ExecutorService
)来运行其任务


如何确定与框架或其他服务池相关的理想池大小?

如果不在具有代表性工作负载的生产环境(在生产硬件等上)的web容器中运行应用程序,则无法确定“理想”池大小

换句话说,将池大小设置为配置参数并对其进行调优

如果您的应用程序在同一web容器中运行多个应用程序,则需要将它们一起调优



我没有给出明确的建议或公式的原因是,最佳池大小在很大程度上取决于应用程序的性质和工作负载。有一些公式被认为适用于理想化的任务,但它们不太可能比“一次近似”更好。

如上所述,线程池大小没有固定的规则。但根据您的用例,可以使用一些建议或最佳实践

CPU限制的任务

对于CPU限制的任务,Goetz(2002、2006)建议

线程数=CPU数量+1

IO绑定任务

为IO绑定的任务计算出最佳数量并不那么明显。在IO绑定任务期间,CPU将处于空闲状态(等待或阻塞)。此空闲时间可以更好地用于启动另一个IO绑定请求

Subramaniam(2011,第31页)根据以下公式描述了最佳线程数

threads = number of cores * (1 + wait time / service time)

在ApacheTomcat中是否有一些通用的线程池可以使用?线程池是一个相当重的东西。在没有那么多额外任务要运行的情况下,使用一个任务可能有点过头了。@HoriaComan我同意这是最好的解决方案。实际上,我对理论上的情况感兴趣,在那里你不能做到这一点,OP不太可能应用这些公式,因为:1)他实际上有多个池要考虑,2)请求很可能是CPU和I/O在不同时间绑定的混合体。