【发布时间】:2013-02-20 16:51:53
【问题描述】:
GenericObjectPool 配置为 12 个线程。一旦 12 个线程用尽,我发现调用者线程变成了僵尸。我认为默认行为是将额外请求排入队列并在可用时提供服务,而不是杀死调用者线程。
private ImplClass implObject;
for (Iterator iter = anArrayList.iterator(); iter.hasNext();) {
//Gets a GenericObjectPool Object
implObject = (ImplClass) this.getImplPool().borrowObject();
some code
}
我已经尝试了以下两种配置来配置池。对我来说,阻塞是好的,只要它从借用语句和循环内它下面的进程行恢复。
<bean id="ImplPool" class="org.apache.commons.pool.impl.GenericObjectPool">
<constructor-arg>
<ref local="ImplFactory"/>
</constructor-arg>
<constructor-arg>
<value>12</value>
</constructor-arg>
</bean>
<bean id="ImplPool" class="org.apache.commons.pool.impl.GenericObjectPool">
<constructor-arg>
<ref local="ImplFactory"/>
</constructor-arg>
<constructor-arg>
<value>12</value>
</constructor-arg>
<constructor-arg>
<bean id="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
</constructor-arg>
<constructor-arg>
<value>-1</value>
</constructor-arg>
</bean>
您能否建议在达到阈值时阻止 GenericObjectPool 的配置?
【问题讨论】:
-
你用的是什么框架?
-
我觉得你的第二个配置没问题。
caller thread goes zombie是什么意思?如何查看线程状态? -
我更正了这个。问题是我没有将对象返回到池中。我后来做了一个专门的线程来将对象返回到池,并解决了这个问题。
标签: java multithreading spring threadpool