我有一个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大小(如果是这样的话)?
另外,我什么时候应该关闭执行程序服务?
我是新手以这种方式旋转线程,有人可以帮我理解它是如何工作的吗?
答案 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个下游服务的响应时有多少资源争用?