浅谈ThreadPoolTaskExeuctor配置

概念

线程池,从字面意思上去看是指一组管理工作线程的资源池。在实际开发过程中需要并发,异步操作时,经常会用Spring中的ThreadPoolTaskExecutor来管理线程处理任务。

配置说明

  • 基本配置
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
	<!-- 核心线程数 -->
	<property name="corePoolSize" value="2" />
	<!-- 线程池维护线程的最大数量 -->
	<property name="maxPoolSize" value="6" />
	<!-- 允许的空闲时间 -->
	<property name="keepAliveSeconds" value="200" />
	<!-- 缓存队列 -->
	<property name="queueCapacity" value="10" />
	<!--设置为守护线程-->
	<property name="daemon" value="true"/>
	<!--配置是否允许核心线程达到一定空闲时间后进行回收-->
	<property name="allowCoreThreadTimeOut" value="true"/>
	<!-- 对拒绝task的处理策略 -->
	<property name="rejectedExecutionHandler">
		<bean class="java.util.concurrent.ThreadPoolExecutor.AbortPolicy" />
	</property>
</bean>

常用的参数属性介绍:

corePoolSize:核心线程数,线程池维护线程的最小数量
maxPoolSize:线程池维护线程的最大数量
queueCapacity:缓存队列长度
keepAliveSeconds:允许线程空闲的时间(单位秒),超过该时间,空闲的线程会被销毁,默认只对非核心线程起作用
daemon:配置线程池中的线程是否为守护线程
allowCoreThreadTimeOut:设置为true后,核心线程达到空闲时间后同样被销毁
rejectedExecutionHandler:线程池的拒绝策略

线程池execute执行过程:
计当前线程池中正在运行的线程数量为n
1、当n < corePoolSize时,线程池创建线程来执行任务。
2、当n = corePoolSize时,此时有任务进来,则会被放到阻塞队列workQueue中,当有核心线程有空闲的时候,就会去workQueue队列中取任务并处理;如果队列满了,则新建线程,处理请求,如果线程池中执行线程数量达到maxPoolSize时就用RejectedExecutionHandler执行拒绝策略
3、当n > corePoolSize时,多余的线程会空闲时在等待keepAliveSeconds后,如果没有任务处理则自行销毁。

在线程池中reject策略有四种:
1、ThreadPoolExecutor.AbortPolicy:默认的拒绝策略,处理任务遭到拒绝后会抛出RejectedExecutionHandler异常
2、ThreadPoolExecutor.CallerRunsPolicy:如果线程池未关闭,那么就会去执行这个任务,反之则将其丢弃
3、ThreadPoolExecutor.DiscardPolicy:不能被执行的任务将被丢弃
4、ThreadPoolExecutor.DiscardOldestPolicy:如果线程池尚未关闭,则位于队列头部的任务将被删除,然后执行该任务

  • 配置说明
    下面通过一些图例来说明spring中配置的ThreadPoolExecutor线程池各个参数的意义
    (1)线程池中运行的线程数小于等于corePoolSize时候
    在这里插入图片描述
    (2)核心线程空闲时,取队列任务进行
    在这里插入图片描述
    (3)如果队列满了,则新建线程执行任务
    在这里插入图片描述
    (4)如果执行的线程数达到maxPoolSize,则对新任务执行拒绝策略
    在这里插入图片描述

监控属性

我们可以通过ThreadPoolTaskExecutor中的一些方法来监控当前线程池的状态。
1、getCorePoolSize:获取当前核心线程数量
2、getMaximumPoolSize:获取线程池内最大可运行的线程数量
3、getPoolSize:获取池中当前线程数量
4、getActiveCount:获取池中当前活动的线程数量
5、getTaskCount:获取池中需要执行的任务数量(已完成的+队列中的)
6、getQueue:获取池中当前的队列,在执行size方法获取队列中任务的数量

发布了18 篇原创文章 · 获赞 0 · 访问量 278
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览