Spring线程池配置
来源:互联网 发布:四大公司人工智能 编辑:程序博客网 时间:2024/05/19 05:40
Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现。
Spring 配置线程池,有两种方式:
方式一:XML定义bean
<!-- 包路径扫描 --> <context:component-scan base-package="spring.task"/> <!-- Spring线程池 --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="5" /> <!-- 线程池维护线程的最大数量 --> <property name="maxPoolSize" value="10" /> <!-- 允许的空闲时间, 默认60秒 --> <property name="keepAliveSeconds" value="60" /> <!-- 任务队列 --> <property name="queueCapacity" value="50" /> <!-- 线程超过空闲时间限制,均会退出直到线程数量为0 --> <property name="allowCoreThreadTimeOut" value="true"/> <!-- 对拒绝task的处理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy" /> </property> </bean>
当一个新任务来临时:1)如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务;2)如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列;3)如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maxPoolSize,建新的线程来处理被添加的任务;4)如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maxPoolSize,那么通过handler所指定的策略来处理此任务;5)当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,如果allowCoreThreadTimeOut为false,则线程数量维持在corePoolSize, 如果为true,则线程数量可最低降至0;
方式二:使用task:executor方式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> <!-- 包路径扫描 --> <context:component-scan base-package="spring.task"/> <!-- 定义线程池 --> <task:executor id="executor" pool-size="5" queue-capacity="10" rejection-policy="DISCARD_OLDEST"/></beans>
测试代码
@Componentpublic class AsyncTask { @Autowired private ThreadPoolTaskExecutor executor; @PostConstruct public void testAsycTask() { for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { public void run() { asyncTask(); } }); } }private void asyncTask(){ System.out.println( "---" + Thread.currentThread().getName()); } }
测试结果
---executor-1---executor-2---executor-3---executor-4---executor-5---executor-6---executor-7---executor-8---executor-9---executor-10
阅读全文
0 0
- Spring线程池配置
- Spring线程池配置
- spring配置线程池
- Spring线程池配置
- Spring线程池配置
- spring线程池配置
- spring线程池配置
- spring线程池ThreadPoolExecutor配置
- spring boot 线程池配置
- 在spring中配置线程池
- spring-boot-data-redis线程池配置
- Spring中配置线程池ThreadPoolExecutor参考
- spring线程池配置及使用
- Spring线程池ThreadPoolTaskExecutor配置及详情
- Spring线程池ThreadPoolTaskExecutor配置及详情
- java多线程,spring配置线程池
- Spring线程池ThreadPoolTaskExecutor配置及详情
- spring线程池配置及使用
- Android模糊查询(首字母、简拼、全拼,汉字)
- hylan:学习oracle相关的名词解释
- 南阳理工acm 311完全背包
- 第二章:使用Storyboard设计用户界面(一)
- Hdu 3709 Balanced Number 数位DP
- Spring线程池配置
- 前端解决跨域问题的8种方案(最新最全)
- 了解Linux中的常用命令
- Java+Selenium3方法篇43-利用Jexcel操作2003版本excel
- hdu_1272-小希的迷宫(经典并查集)
- centos7 安装mysql
- 实时任务带宽控制
- 第二章:使用Storyboard设计用户界面(二)
- ReentranLock 与Synchronized