ThreadPoolTaskExecutor和ThreadPoolExecutor
1、ThreadPoolExecutor
线程池接口:ExecutorService为线程池接口,提供了线程池生命周期方法,继承自Executor接口,ThreadPoolExecutor为线程池实现类,提供了线程池的维护操作等相关方法,继承自AbstractExecutorService,AbstractExecutorService实现了ExecutorService接口。
工具类 : Executors
Executors为线程迟工具类,相当于一个工厂类,用来创建合适的线程池,返回ExecutorService类型的线程池。有如下方法。
ExecutorService newFixedThreadPool() : 创建固定大小的线程池
ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
ExecutorService newSingleThreadExecutor() : 创建单个线程池。 线程池中只有一个线程
ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务
其中AbstractExecutorService是他的抽象父类,继承自ExecutorService,ExecutorService 接口扩展Executor接口,增加了生命周期方法。
2.ThreadPoolTaskExecutor
这个类则是spring包下的,是sring为我们提供的线程池类,这里重点讲解这个类的用法,可以使用基于xml配置的方式创建
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="10"/> <!-- 最大线程数 --> <property name="maxPoolSize" value="200"/> <!-- 队列最大长度 >=mainExecutor.maxSize --> <property name="queueCapacity" value="10"/> <!-- 线程池维护线程所允许的空闲时间 --> <property name="keepAliveSeconds" value="20"/> <!-- 线程池对拒绝任务(无线程可用)的处理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> </property> </bean>
然后通过自动注入的方式注入线程池,
@Resource(name="taskExecutor") ThreadPoolTaskExecutor taskExecutor; // 或者可以直接@Autowried @AutoWired ThreadPoolTaskExecutor taskExecutor
或者是通过配置类的方式配置线程池,然后注入。
@Configuration public class ExecturConfig { @Bean("taskExector") public Executor taskExector() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); int i = Runtime.getRuntime().availableProcessors();//获取到服务器的cpu内核 executor.setCorePoolSize(5);//核心池大小 executor.setMaxPoolSize(100);//最大线程数 executor.setQueueCapacity(1000);//队列程度 executor.setKeepAliveSeconds(1000);//线程空闲时间 executor.setThreadNamePrefix("tsak-asyn");//线程前缀名称 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//配置拒绝策略 return executor; }
提交任务
- 无返回值的任务使用
execute(Runnable)
- 有返回值的任务使用
submit(Runnable)
上面注解中已经注释了参数的详解,这里重点讲解一下spring线程池的拒绝策略和处理流程。
拒绝策略
rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下
AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
其他说明:
- 为了实现某些特殊的业务需求,用户可以选择使用自定义策略,只需实现
RejectedExecutionHandler
接口即可。 - 建议配置
threadNamePrefix
属性,出问题时可以更方便的进行排查。
处理流程
1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,就是执行第二步。
2.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。
3.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。
4.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。
流程图如下
监控线程池状态
常用状态:
taskCount:线程需要执行的任务个数。
completedTaskCount:线程池在运行过程中已完成的任务数。
largestPoolSize:线程池曾经创建过的最大线程数量。
getPoolSize获取当前线程池的线程数量。
getActiveCount:获取活动的线程的数量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!