Java Tomcat7中的应用程序线程

Java Tomcat7中的应用程序线程,java,multithreading,spring,tomcat,executorservice,Java,Multithreading,Spring,Tomcat,Executorservice,我有一个Web服务,它反过来调用10个其他Web服务,这会导致更高的响应时间 <bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" scope="prototype"> <property name="corePoolSize" value="3" /> <property name="max

我有一个Web服务,它反过来调用10个其他Web服务,这会导致更高的响应时间

<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" scope="prototype">
    <property name="corePoolSize" value="3" />
    <property name="maxPoolSize" value="4" />
    <property name="keepAliveSeconds" value="5" />
</bean>

我正在监视JvisualVM中的线程,并注意到始终有3个executorservices线程。我正在试图了解,是会为每个通过的请求旋转3个线程,还是所有请求都会尝试使用配置的相同3个corePoolSize

如果所有的请求都将使用3个线程,那么应该增加核心池的大小(如果是,增加到什么数字)

还有,我应该什么时候关闭executor服务


我不熟悉这种纺线方式,有人能帮我理解它是如何工作的吗

默认情况下,Spring中的bean是单例的,因此您只有一个管理大小为3-4的线程池的
executorService
实例

创建池时,它将启动3个线程,然后这些线程在需要时处于空闲状态。如果需要更多的线程,它最多将使用4个线程,因此只比最初创建的多1个线程


这与有多少传入请求试图使用池无关。

Spring中的bean默认为单例,因此您只有一个管理大小为3-4的线程池的
executorService
实例

创建池时,它将启动3个线程,然后这些线程在需要时处于空闲状态。如果需要更多的线程,它最多将使用4个线程,因此只比最初创建的多1个线程


这与有多少传入请求试图使用池无关。

Spring中的bean默认为单例,因此您只有一个管理大小为3-4的线程池的
executorService
实例

创建池时,它将启动3个线程,然后这些线程在需要时处于空闲状态。如果需要更多的线程,它最多将使用4个线程,因此只比最初创建的多1个线程


这与有多少传入请求试图使用池无关。

Spring中的bean默认为单例,因此您只有一个管理大小为3-4的线程池的
executorService
实例

创建池时,它将启动3个线程,然后这些线程在需要时处于空闲状态。如果需要更多的线程,它最多将使用4个线程,因此只比最初创建的多1个线程


这与有多少传入请求试图使用池无关。

正如@andreas所提到的,您将有一个executorservice实例,因为bean定义默认为singleton

上面说,
corePoolSize
——池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut。因此,池中始终有三个线程处于活动状态,尽管它们是活动的。如果有更多请求,池大小将增加到4,因为您已将
maxPoolSize
设置为4。但是第四个线程(您不知道是哪个线程)在空闲5秒后将退出池,因为您已将
keepAliveTime
设置为5

要回答你问题的后面部分,你可以看看我对类似问题的回答。这是一个性能调优问题,取决于应用程序处理I/O、CPU等的方式


正如您所说的,您正在为一个传入的请求调用10个其他web服务,因此一个请求将分成10个请求。它们是网络I/O绑定还是CPU绑定?你如何合并它们?合并来自10个下游服务的响应时有多少资源争用?

正如@andreas所提到的,您将有一个executorservice实例,因为bean定义默认为singleton

上面说,
corePoolSize
——池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut。因此,池中始终有三个线程处于活动状态,尽管它们是活动的。如果有更多请求,池大小将增加到4,因为您已将
maxPoolSize
设置为4。但是第四个线程(您不知道是哪个线程)在空闲5秒后将退出池,因为您已将
keepAliveTime
设置为5

要回答你问题的后面部分,你可以看看我对类似问题的回答。这是一个性能调优问题,取决于应用程序处理I/O、CPU等的方式


正如您所说的,您正在为一个传入的请求调用10个其他web服务,因此一个请求将分成10个请求。它们是网络I/O绑定还是CPU绑定?你如何合并它们?合并来自10个下游服务的响应时有多少资源争用?

正如@andreas所提到的,您将有一个executorservice实例,因为bean定义默认为singleton

上面说,
corePoolSize
——池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut。因此,池中始终有三个线程处于活动状态,尽管它们是活动的。如果有更多请求,池大小将增加到4,因为您已将
maxPoolSize
设置为4。但是第四个线程(您不知道是哪个线程)在空闲5秒后将退出池,因为您已将
keepAliveTime
设置为5

要回答你问题的后面部分,你可以看看我对类似问题的回答。这是一个性能调优问题,取决于应用程序处理I/O、CPU等的方式


正如您所说的,您正在为一个传入的请求调用10个其他web服务,因此一个请求将分成10个请求。它们是网络I/O绑定还是CPU绑定?你如何合并它们?合并来自10个下游服务的响应时会有多少资源争用?

正如@andreas所提到的,您将有一个实例