我正在使用 Spring 4.3.8.RELEASE 和 Java 7。我想创建一个线程池来执行任务,所以我在 Spring contxet 中设置了以下内容
<bean id="myThreadFactory" class="org.springframework.scheduling.concurrent.CustomizableThreadFactory">
<constructor-arg value="mythread-"/>
</bean>
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="threadFactory" ref="myThreadFactory"/>
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="50" />
</bean>
为了不破坏机器 CPU 使用率,我想限制系统中可以存在的并发线程数量(我假设这就是 maxPOolSize 的作用)。但我不希望任务被丢弃。如果我向我的 taskPoolExecutor 添加超过 50 个任务,那么第 51 个任务会怎样?更重要的是,在开始删除任务之前可以添加的默认任务数是多少?
Setting maxPoolSize
隐式允许任务被删除。
但是,默认队列容量是Integer.MAX_VALUE
,出于实际目的,它是无穷大。
需要注意的是ThreadPoolTaskExecutor
uses a ThreadPoolExecutor
下面,它有一种有点不寻常的排队方法,描述于the docs https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html:
If corePoolSize
或者有更多线程正在运行,执行器总是更喜欢对请求进行排队而不是添加新线程。
这意味着maxPoolSize
仅当队列已满时才相关,否则线程数永远不会增长超过corePoolSize
。
举个例子,如果我们提交任务永远不会完成的到线程池:
- 首先
corePoolSize
每次提交都会启动一个新线程;
- 之后,所有提交都会进入队列;
- 如果队列有限并且容量耗尽,则每次提交都会启动一个新线程,直到有
maxPoolSize
池中的线程;
- 当池和队列都已满时,新的提交将被拒绝。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)