• Spring ThreadPoolTaskExecutor


    1. 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的处理策略

    2. execute(Runable)方法执行过程

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

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

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

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

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

    3. 示例代码

    Junit Test

     1 @RunWith(SpringJUnit4ClassRunner.class)
     2 @ContextConfiguration(classes = { MultiThreadConfig.class })
     3 public class MultiThreadTest {
     4 
     5     @Autowired
     6     private ThreadPoolTaskExecutor taskExecutor;
     7 
     8     @Autowired
     9     private MultiThreadProcessService multiThreadProcessService;
    10     
    11     @Test
    12     public void test() {
    13         
    14         int n = 20;
    15         for (int i = 0; i < n; i++) {
    16             taskExecutor.execute(new MultiThreadDemo(multiThreadProcessService));
    17             System.out.println("int i is " + i + ", now threadpool active threads totalnum is " + taskExecutor.getActiveCount());
    18         }
    19         
    20         try {
    21             System.in.read();
    22         } catch (IOException e) {
    23             throw new RuntimeException(e);
    24         }
    25     }
    26 }

    MultiThreadDemo

     1 /**
     2  * 多线程并发处理demo
     3  * @author daniel.zhao
     4  *
     5  */
     6 public class MultiThreadDemo implements Runnable {
     7 
     8     private MultiThreadProcessService multiThreadProcessService;
     9     
    10     public MultiThreadDemo() {
    11     }
    12     
    13     public MultiThreadDemo(MultiThreadProcessService multiThreadProcessService) {
    14         this.multiThreadProcessService = multiThreadProcessService;
    15     }
    16     
    17     @Override
    18     public void run() {
    19         multiThreadProcessService.processSomething();
    20     }
    21 
    22 }

    MultiThreadProcessService

     1 @Service
     2 public class MultiThreadProcessService {
     3 
     4     public static final Logger logger = Logger.getLogger(MultiThreadProcessService.class);
     5     
     6     /**
     7      * 默认处理流程耗时1000ms
     8      */
     9     public void processSomething() {
    10         logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......start");
    11         try {
    12             Thread.sleep(1000);
    13         } catch (InterruptedException e) {
    14             throw new RuntimeException(e);
    15         }
    16         logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......end");
    17     }
    18 }
  • 相关阅读:
    C#编程语言详解(第2版) 11.3 类和结构的区别
    .Net程序员如何快速成长之我见
    封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
    POJ1163The Triangle
    hdoj_1231&&hdoj_1003最大连续子序列
    数组名++操作导致的_BLOCK_TYPE_IS_VALID
    《windows程序设计》第二章学习心得
    error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
    Windows环境下Unicode编程总结
    已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置,以保持线性表的有序
  • 原文地址:https://www.cnblogs.com/jtlgb/p/7991971.html
Copyright © 2020-2023  润新知