2017-06-19 54 views
1

我使用Spring 4.3.8.RELEASE与Java 7.我想创建一个线程池来执行任务,所以我成立了我的春节contxet什么是ThreadPoolTask​​Executor的Spring默认队列大小?

<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号会发生什么?更重要的是,在开始掉线之前可以添加的默认任务数是多少?

+0

默认值是'Integer.MAX_VALUE',意思是无界的。请参阅https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTask​​Executor.html#setQueueCapacity-int-。 –

回答

1

设置maxPoolSize隐式允许任务被丢弃。 但是,默认队列容量为Integer.MAX_VALUE,实际用途为无穷大。

事情需要提防的是,ThreadPoolTaskExecutor使用ThreadPoolExecutor下,具有不同寻常的方法来排队,在the docs描述:

如果corePoolSize或多个线程运行,执行程序始终喜欢排队请求而不是添加新线程。

这意味着maxPoolSize只与队列满时有关,否则线程数永远不会超过corePoolSize。 作为一个例子,如果我们提交任务从未完整线程池:

  • 第一corePoolSize提交将启动一个新线程的每个;
  • 之后,所有提交到队列;
  • 如果队列是有限的并且其容量已用尽,则每次提交都会启动一个新线程,最多为maxPoolSize;
  • 当池和队列都满时,新的提交被拒绝。
+0

我并没有把你所说的东西捆绑在一起。如果队列是无限的,它永远不会满,对吗?因此,如果我的核心池大小为10,最大池大小为50,那么添加第51个线程时会发生什么? – Dave

+0

我编辑了我的答案来提供一个例子,它有帮助吗? – kewne

+0

我这么认为。所以在我的代码中,我没有为队列大小指定一个值。那么这是否意味着我的maxPoolSize指定的参数是无意义的,因为队列的默认大小是无限的? – Dave

相关问题