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 }
Spring ThreadPoolTaskExecutor的更多相关文章
- Spring ThreadPoolTaskExecutor队列满的异常处理
<!-- 配置线程池 --> <bean id="threadPool" class="org.springframework.scheduling.c ...
- 使用Spring ThreadPoolTaskExecutor实现多线程任务
我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池,线程池 ...
- spring ThreadPoolTaskExecutor使用总结
ThreadPoolTaskExecutor提供TaskDecorator可以实现类似ThreadPoolExecutor.afterExecute()类似功能 taskDecorator主要是对Ru ...
- [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...
- Spring的线程池ThreadPoolTaskExecutor使用案例
1.Sping配置文件 <!-- 线程池配置 --> <bean id="threadPool" class="org.springframework. ...
- Spring多线程批量发送邮件(ThreadPoolTaskExecutor)
1,需求:使用多线程批量发送邮件 需要批量发送邮件大概400封左右,但是因为发送邮件受网络限制,所以经常导致等待超时.所以就想到了使用多线程来发邮件,因为是异步的所以返回结果不受发邮件影响. 2,思路 ...
- java 线程池(ExecutorService与Spring配置threadPoolTaskExecutor)
一.java ExecutorService实现 创建ExecutorService变量private ExecutorService executor = null 2.执行对应任务时,首先生成线程 ...
- Spring中的ThreadPoolTaskExecutor
在观察线上系统的运行情况下,发现在错误日志中有这类错误信息,org.springframework.core.task.TaskRejectedException,于是便对ThreadPoolTa ...
- Spring线程池ThreadPoolTaskExecutor配置及详情
Spring线程池ThreadPoolTaskExecutor配置及详情 1. ThreadPoolTaskExecutor配置 <!-- spring thread pool executor ...
随机推荐
- UI设计心得
旁观型ui.追求一种无所不在,同时低调退隐的,奢华的存在感.内容由用户自己去搜索,浏览,构建,召唤,或是随着信息世界的某种外界趋势自然产生,ui作为始终凌驾于用户之上的高高在上的守护神,随时起到中承, ...
- java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile
http://blog.csdn.net/zlp1992/article/details/50298195 给个链接自己去看吧.网上资料不是很多,而且自己也不想写了 RandomAccessFil ...
- bzoj1833 数字计数
Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...
- 实验八 c排序算法
8.1 #include<stdio.h> int main(){ int a[5],i,j,k,t,z; //输入5个元素进入数组 for(i=0;i<5;i++) scanf(& ...
- 【整理总结】代码沉淀 - CefSharp - 比较流行的第三方内嵌浏览器组件
.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework web: https://github.com/ce ...
- 一次JVM内存调整
单台服务器8G内存,2核 系统里装了redis, rocketmq, mysql, zookeeper, 还有20个左右的微服务,每个微服务的jvm 参数 -Xms128m -Xmx256m -Xmn ...
- BCGcontrolBar(五) 对话框大小改变控件自动适应
改变控件大小 首先在 构造函数中加入 EnableLayout(); 在OnInitDialog()函数中加入 CBCGPStaticLayout* pLayout = (CBCGPStaticLay ...
- php变量详细讲解
变量是用于存储信息的"容器". 定义一个变量的语法: $变量名 = 值; 使用变量的例子: <?php $x=5; $y=6; $z=$x+$y; echo $z; ?> ...
- 详解 Facebook 田渊栋 NIPS2017 论文:深度强化学习研究的 ELF 平台
这周,机器学习顶级会议 NIPS 2017 的论文评审结果已经通知到各位论文作者了,许多作者都马上发 Facebook/Twitter/Blog/ 朋友圈分享了论文被收录的喜讯.大家的熟人 Faceb ...
- jq上下级元素查找方法
1.parent([expr]) 获取指定元素的所有父级元素 2.next([expr]) 获取指定元素的下一个同级元素 3.nextAll([expr]) 获取指定元素后面的所有同级元素 4.and ...