Spring线程池ThreadPoolTaskExecutor配置及详情

来源:互联网 发布:矩阵范数怎么计算 编辑:程序博客网 时间:2024/05/19 06:18

 ThreadPoolTaskExecutor配置

复制代码
 1 <!-- spring thread pool executor -->            2     <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 3         <!-- 线程池维护线程的最少数量 --> 4         <property name="corePoolSize" value="5" /> 5         <!-- 允许的空闲时间 --> 6         <property name="keepAliveSeconds" value="200" /> 7         <!-- 线程池维护线程的最大数量 --> 8         <property name="maxPoolSize" value="10" /> 9         <!-- 缓存队列 -->10         <property name="queueCapacity" value="20" />11         <!-- 对拒绝task的处理策略 -->12         <property name="rejectedExecutionHandler">13             <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />14         </property>15     </bean>
复制代码

属性字段说明:

corePoolSize:线程池维护线程的最少数量

keepAliveSeconds:允许的空闲时间

maxPoolSize:线程池维护线程的最大数量

queueCapacity:缓存队列

rejectedExecutionHandler:对拒绝task的处理策略

Reject策略预定义有四种: 
(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。 
(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. 
(3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃. 
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)

execute(Runable)方法执行过程

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maxPoolSize,建新的线程来处理被添加的任务。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maxPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

示例代码

 public class MultiThreadTest {        @Autowired      private ThreadPoolTaskExecutor taskExecutor;        @Autowired      private MultiThreadProcessService multiThreadProcessService;//自定义线程          @Test     public void test() {                  int n = 20;         for (int i = 0; i < n; i++) {             taskExecutor.execute(new MultiThreadDemo(multiThreadProcessService));             System.out.println("int i is " + i + ", now threadpool active threads totalnum is " + taskExecutor.getActiveCount());         }                 try {             System.in.read();         } catch (IOException e) {             throw new RuntimeException(e);         }     } }