应用程序线程在tomcat 7中

时间:2015-08-20 01:50:04

标签: java multithreading spring tomcat executorservice

我有一个web服务,它反过来调用10个其他web服务,它会导致更高的响应时间。所以我使用ExecutorService通过spring servlet.xml config生成线程,如下所示

<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个线程应该增加corepool大小(如果是这样的话)?

另外,我什么时候应该关闭执行程序服务?

我是新手以这种方式旋转线程,有人可以帮我理解它是如何工作的吗?

2 个答案:

答案 0 :(得分:2)

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

创建池时,它将启动3个线程,然后空闲直到需要。如果需要更多线程,它将使用最多4个线程,因此只比最初创建的线程多1个。

这与尝试使用池的传入请求数无关。

答案 1 :(得分:1)

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

doc表示corePoolSize - 池中保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut。因此,尽管它们还活着,但池中总会有三个线程存活。如果有更多请求,则池大小将增加到4,因为您已将maxPoolSize设置为4.但是第四个线程(您不知道哪个)在闲置5秒后将不在池中因为您已将keepAliveTime设置为5。

要回答问题的后半部分,您可以查看我对类似问题的答案here。这是一个性能调优问题,取决于您的应用程序如何处理I / O,CPU等。

正如您所说的那样,您正在为一个传入请求调用10个其他Web服务,因此一个请求正在扇出10个请求。它们是网络I / O绑定还是CPU绑定?你怎么合并他们?合并10个下游服务的响应时有多少资源争用?