使用ThreadPoolTask​​Executor,Spring的默认队列大小是多少?

Dav*_*ave 5 queue spring multithreading threadpool threadpoolexecutor

我正在使用Spring 4.3.8.RELEASE和Java 7.我想创建一个线程池来执行任务,所以我在Spring consxet中设置了以下内容

<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>
Run Code Online (Sandbox Code Playgroud)

为了不破坏机器的CPU使用率,我想限制系统中可能存在的并发线程数量(我假设这是maxPOolSize所做的).但我不希望任务被丢弃.如果我向taskPoolExecutor添加了50多个任务,51号会发生什么?更重要的是,在开始被删除之前可以添加的默认任务数是多少?

kew*_*wne 14

maxPoolSize隐式设置允许删除任务.但是,默认队列容量是Integer.MAX_VALUE,实际上,它是无穷大.

需要注意的是ThreadPoolTaskExecutor使用ThreadPoolExecutor底层,这有一种不同寻常的排队方法,在文档中有描述:

如果corePoolSize正在运行或多个线程,则执行程序总是更喜欢排队请求而不是添加新线程.

这意味着maxPoolSize仅在队列已满时才相关,否则线程数将永远不会增长corePoolSize.例如,如果我们提交永远不会完成到线程池的任务:

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

  • 是的,您的池永远不会运行超过 `corePoolSize` 线程。 (4认同)
  • 我认为第三点应该更正为“如果队列是有限的并且其容量已耗尽,则每次提交都会启动一个新线程,直到`maxPoolSize-corePoolSize`;” (2认同)