当我们需要实现并发、异步等操作时,通常都会使用到ThreadPoolTaskExecutor,现对其使用稍作总结。

配置
ThreadPoolTaskExecutor通常通过XML方式配置,或者通过Executors的工厂方法进行配置。
XML方式配置代码如下:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="8"/> <!--核心线程数 -->
<property name="maxPoolSize" value="16"/> <!--最大线程数 -->
<property name="keepAliveSeconds" value ="3000"/> <!--线程最大空闲时间 -->
<property name="queueCapacity" value="200"/> <!-- 队列大小 -->
<property name="threadNamePrefix" value="TASK_EXECUTOR"/>
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/>
</property>
</bean>

rejectedExecutionHandler字段用于配置拒绝策略,常用的拒绝策略如下:

AbortPolicy,用于被拒绝任务的处理程序,它将抛出RejectedExecutionException。
CallerRunsPolicy,用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy,用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy,用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
其他说明:

为了实现某些特殊的业务需求,用户可以选择使用自定义策略,只需实现RejectedExecutionHandler接口即可。
建议配置threadNamePrefix属性,出问题时可以更方便的进行排查。
提交任务
无返回值的任务使用execute(Runnable)
有返回值的任务使用submit(Runnable)
处理流程
当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,是就执行第二步。
查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。
查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。
查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。
在ThreadPoolExecutor中表现为:

如果当前运行的线程数小于corePoolSize,那么就创建线程来执行任务(执行时需要获取全局锁)。
如果运行的线程大于或等于corePoolSize,那么就把task加入BlockQueue。
如果创建的线程数量大于BlockQueue的最大容量,那么创建新线程来执行该任务。
如果创建线程导致当前运行的线程数超过maximumPoolSize,就根据饱和策略来拒绝该任务。
关闭线程池
调用shutdown或者shutdownNow,两者都不会接受新的任务,而且通过调用要停止线程的interrupt方法来中断线程,有可能线程永远不会被中断,不同之处在于shutdownNow会首先将线程池的状态设置为STOP,然后尝试停止所有线程(有可能导致部分任务没有执行完)然后返回未执行任务的列表。而shutdown则只是将线程池的状态设置为shutdown,然后中断所有没有执行任务的线程,并将剩余的任务执行完。

配置线程个数
如果是CPU密集型任务,那么线程池的线程个数应该尽量少一些,一般为CPU的个数+1条线程。
如果是IO密集型任务,那么线程池的线程可以放的很大,如2*CPU的个数。
对于混合型任务,如果可以拆分的话,通过拆分成CPU密集型和IO密集型两种来提高执行效率;如果不能拆分的的话就可以根据实际情况来调整线程池中线程的个数。
监控线程池状态
常用状态:

taskCount:线程需要执行的任务个数。
completedTaskCount:线程池在运行过程中已完成的任务数。
largestPoolSize:线程池曾经创建过的最大线程数量。
getPoolSize获取当前线程池的线程数量。
getActiveCount:获取活动的线程的数量
通过继承线程池,重写beforeExecute,afterExecute和terminated方法来在线程执行任务前,线程执行任务结束,和线程终结前获取线程的运行情况,根据具体情况调整线程池的线程数量。

参考来源:

[1] https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html
---------------------
作者:楚兴
来源:CSDN
原文:https://blog.csdn.net/foreverling/article/details/78073105?utm_source=copy

版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/minikobe/p/9797984.html

ThreadPoolTaskExecutor使用详解相关推荐

  1. async spring 默认线程池_Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@A ...

  2. springboot主线程_Springboot对多线程的支持详解

    Springboot对多线程的支持详解 这两天看阿里的JAVA开发手册,到多线程的时候说永远不要用 new Thread()这种方式来使用多线程.确实是这样的,我一直在用线程池,到了springboo ...

  3. ActiveMQ中Consumer特性详解与优化

    前言 从本文中你可以了解到如下内容: 1) consumer端消息消费的模型,session的运作机制 2) 如果提升broker和consumer端消息消费的速率 3) selector,group ...

  4. java 线程与线程池详解

    并发:同一时刻,多任务交替执行,造成一种"貌似同时"的错觉.简言之,单核cpu实现的多任务就是并发. 并行:同一时刻,多任务同时执行.多核cpu可实现并行. 在创建线程时,可以使用 ...

  5. MAVEN专题之三、坐标和依赖详解

    maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能.** 这是maven系列第3篇. 我们先来回顾一下什么是maven? maven是apache软件基金会组织维护的一款自动化构 ...

  6. Spring Boot笔记—多线程系列(三)—配置参数详解

    前言 前两篇文章,我们已经学会了如何使用spring boot的多线程和自定义线程池.这篇文章,我们要深入了解上一篇文章中线程池的配置具体含义. 准备工作 说明 为了方便观察线程的情况(如执行完毕数量 ...

  7. Java面试题 详解 超全200题

    目录 一.类.对象.方法.变量 二.集合类 三.流 四.多线程 五.异常处理 六.JVM 七.HotSpot虚拟机中的7种垃圾收集器 八.Javaweb 一.类.对象.方法.变量 1.知识图谱 2.类 ...

  8. 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略

    目录 引言 线程池使用场景 加快请求响应(响应时间优先) 加快处理大任务(吞吐量优先) 特殊说明 线程池的池化技术 线程池的创建 手动创建 创建newFixedThreadPool线程池 创建newS ...

  9. Mybatis-Plus+SpringBoot框架详解

    一.SpringBoot 概述 1.SpringBoot 简介 SpringBoot 提供了一种快速使用 Spring 的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的 ...

最新文章

  1. 【哈希和哈希表】Beads
  2. string拆分为int_拆分为流
  3. python银行系统模拟演练_python多线程实现代码(模拟银行服务操作流程)
  4. 用etcd实现比Redis更安全的分布式锁
  5. java反射 获取变量值_Java反射:如何获取变量的名称?
  6. windows.old可以删除吗_C盘里的文件夹都有何用?可以删除吗?哪些可以删除?
  7. require.js 的简单运用 --兰
  8. 邯郸计算机理工学院,邯郸理工学校2021年招生简章
  9. 关于在Mac上安装模拟器的坑比~~~~~
  10. CodeIgniter的缓存小记
  11. 阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用
  12. SVN,HG,GIT 命令说明
  13. 初次涉足手机广告联盟行业
  14. wps的ppt放映时不能完全全屏的解决方法
  15. 百度统计接口调用——登录接口
  16. 王之泰201771010131《面向对象程序设计(java)》第一周学习总结
  17. 163邮箱登录不了Outlook解决方案
  18. 萌新扫盲4—交换机级联?还是堆叠?
  19. OpenCV图像处理知识点梳理
  20. Android--设置App的启动页面

热门文章

  1. disconf mysql_disconf-web安装
  2. 美链BEC合约漏洞技术分析
  3. RNN-循环神经网络-02Tensorflow中的实现
  4. php 云技术,什么叫云技术?
  5. qlabel文本改变信号_周明:NLP进步将如何改变搜索体验
  6. QML编程之旅 -- 事件处理
  7. java union方法参数_Java Geometry.union方法代碼示例
  8. 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成
  9. BestCoder-Round#33
  10. [CODEVS 1050] 棋盘染色 2