java executorService 中 tomcat 的最大线程数
Max Number of threads in java executorService with tomcat
Tomcat 默认情况下允许最多 200 个线程在 Spring 引导应用程序中处理请求。
假设在应用程序中,在进程启动期间,我创建了一个大小为 10 的 FixedThreadpool。
现在,当我尝试将这个东西与 tomcat 一起使用时,我的最大线程总数是多少 运行。是 200 + 10 还是 200 * 10?
我的理解是它将是 200 + 10,因为仅在进程级别 java 将创建线程池并在需要时使用该线程池。
这也取决于我如何启动线程池吗?例如,假设我创建了一个线程池执行器的 bean 并在整个系统中使用它。
@Bean("helperExecutorService")
public ExecutorService helperExecutorService(HelperThreadPoolConfig helperThreadPoolConfig) {
return Executors.newFixedThreadPool(helperThreadPoolConfig.getThreadPoolSize());
}
或者我可以在代码流中创建线程池。
public void something() {
ExecutorService service = Executors.newFixedThreadPool(summariesToAutocompute.size());
... use this threadpool in the method
}```
对于 tomcat 上的一个应用程序实例 运行,tomcat 将在服务器启动时创建一个线程池,应用程序将在启动时创建固定的线程池。这不是一个无共享的 cgi,它是一个留在内存中的长 运行 java 进程,200 + 10 是正确的。
如果您在方法调用中创建池,则每个方法调用都会分配自己的池。因此,如果 tomcats 池中的每个线程都同时发出一个请求,该请求调用了一个创建自己的池的方法,那么正在使用的线程数可能高达 tomcat 池大小乘以方法池大小.
通常我建议不要这样做,因为它似乎削弱了使用池的两个优势:1) 您可以预分配线程,这样您的代码就不必等待线程创建,以及 2) 您可以为您的程序使用的最大线程数设置一个上限。
Tomcat 默认情况下允许最多 200 个线程在 Spring 引导应用程序中处理请求。 假设在应用程序中,在进程启动期间,我创建了一个大小为 10 的 FixedThreadpool。
现在,当我尝试将这个东西与 tomcat 一起使用时,我的最大线程总数是多少 运行。是 200 + 10 还是 200 * 10?
我的理解是它将是 200 + 10,因为仅在进程级别 java 将创建线程池并在需要时使用该线程池。
这也取决于我如何启动线程池吗?例如,假设我创建了一个线程池执行器的 bean 并在整个系统中使用它。
@Bean("helperExecutorService")
public ExecutorService helperExecutorService(HelperThreadPoolConfig helperThreadPoolConfig) {
return Executors.newFixedThreadPool(helperThreadPoolConfig.getThreadPoolSize());
}
或者我可以在代码流中创建线程池。
public void something() {
ExecutorService service = Executors.newFixedThreadPool(summariesToAutocompute.size());
... use this threadpool in the method
}```
对于 tomcat 上的一个应用程序实例 运行,tomcat 将在服务器启动时创建一个线程池,应用程序将在启动时创建固定的线程池。这不是一个无共享的 cgi,它是一个留在内存中的长 运行 java 进程,200 + 10 是正确的。
如果您在方法调用中创建池,则每个方法调用都会分配自己的池。因此,如果 tomcats 池中的每个线程都同时发出一个请求,该请求调用了一个创建自己的池的方法,那么正在使用的线程数可能高达 tomcat 池大小乘以方法池大小.
通常我建议不要这样做,因为它似乎削弱了使用池的两个优势:1) 您可以预分配线程,这样您的代码就不必等待线程创建,以及 2) 您可以为您的程序使用的最大线程数设置一个上限。