java - java executorService 与 tomcat 中的最大线程数

标签 java spring tomcat threadpool executorservice

Tomcat 默认允许最多 200 个线程来处理 Spring Boot 应用程序中的请求。 假设在应用程序中,在进程启动期间,我创建了一个大小为 10 的固定线程池。

现在,当我尝试将这个东西与 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)您可以将程序使用的最大线程数的上限。

关于java - java executorService 与 tomcat 中的最大线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71418676/

相关文章:

java - 在线裁判的问题处理输入

java - 保存文件Java时出现空指针异常

java - Java EE 容器内的并发编程

spring - 使用实现 ApplicationListener 的 @Autowired 注入(inject)一个 bean 不起作用?

java - Spring :PESSIMISTIC_READ/WRITE 不起作用

java - 控件如何从 Web 服务器传输到 Servlet 容器

java - Hadoop: map 输出键未实现WritableComparable。实现RawComparator

java - 查找集合内的值并比较值字段

java - 带有特殊字符的xml,编码utf-8

Spring Webflux带注释的rest Controller 不支持ServerHttpRequest作为方法参数: java. lang.NoSuchMethodException