【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理
ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类,基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展,支持更灵活的配置,并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发请求的场景。
核心特性
Spring 集成
- 可直接通过 XML 或 Java 配置注入到 Spring 容器中。
- 支持 @Async 注解,简化异步方法调用。
参数可配置化
- 核心线程数、最大线程数、队列容量、拒绝策略等均可通过配置调整。
生命周期管理
- 实现 Lifecycle 接口,支持线程池的启动和关闭(如应用关闭时优雅终止任务)。
任务装饰器
- 支持通过 TaskDecorator 对任务进行装饰(如传递上下文信息)。
配置参数详解
通过 Spring 配置文件或 @Bean 定义线程池时,需设置以下关键参数:
| 参数 | 说明 | 默认值 |
| corePoolSize | 核心线程数,即使空闲也不会被回收 | 1 |
| maxPoolSize | 最大线程数,当队列满时创建新线程直到达到此值 | Integer.MAX_VALUE |
| queueCapacity | 任务队列容量(使用 LinkedBlockingQueue 或 ArrayBlockingQueue) | Integer.MAX_VALUE |
| keepAliveSeconds | 非核心线程的空闲存活时间(秒) | 60 |
| threadNamePrefix | 线程名前缀,便于日志追踪 | "task-executor-" |
| allowCoreThreadTimeOut | 是否允许核心线程超时回收 | false |
| rejectedExecutionHandler | 拒绝策略(如 AbortPolicy、CallerRunsPolicy) | AbortPolicy(直接抛出异常) |
使用场景
1、异步任务处理
结合 @Async 注解实现方法异步执行:
@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "taskExecutor")public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}
}@Service
public class MyService {@Async("taskExecutor") // 指定线程池public void asyncProcess() {// 异步逻辑}}
2、高并发请求处理
在 Web 应用中处理大量并发请求,避免阻塞主线程:
@RestController
public class MyController {@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;@GetMapping("/process")public CompletableFuture<String> handleRequest() {return CompletableFuture.supplyAsync(() -> {// 耗时操作return "Result";}, taskExecutor);}}
3、异步任务处理,避免前端等待(常用)
@RestControllerpublic class MyController {@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;@GetMapping("/process")public String handleRequest() {/***主业务*/String str="xxxx";//异步处理taskExecutor.submit(new Runnable() {@Overridepublic void run() {//异步执行业务}});//正常返回给前端return str;}}
4、定时任务调度
与 @Scheduled 结合使用(需配置 TaskScheduler):
@EnableScheduling
@Configuration
public class SchedulerConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(5);scheduler.setThreadNamePrefix("Scheduler-");return scheduler;}}@Service
public class ScheduledService {@Scheduled(fixedRate = 5000)public void scheduledTask() {// 定时任务逻辑}}
拒绝策略(Rejected Policies)
当线程池和队列均满时,处理新任务的策略:
| 策略类 | 行为 |
| AbortPolicy | 直接抛出 RejectedExecutionException(默认) |
| CallerRunsPolicy | 由提交任务的线程直接执行任务(同步阻塞提交者) |
| DiscardPolicy | 静默丢弃新任务,不抛异常 |
| DiscardOldestPolicy | 丢弃队列中最旧的任务,然后重试提交新任务 |
配置示例:
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
监控与调试
- 获取线程池状态
通过 ThreadPoolTaskExecutor 的方法监控线程池:
int activeCount = executor.getThreadPoolExecutor().getActiveCount(); // 活跃线程数long completedTaskCount = executor.getThreadPoolExecutor().getCompletedTaskCount(); // 已完成任务数
- 日志输出
启用 Spring Boot Actuator 的 metrics 端点,或自定义监控逻辑。
与原生 ThreadPoolExecutor 对比
| 特性 | ThreadPoolTaskExecutor | ThreadPoolExecutor |
| 依赖管理 | 集成 Spring 容器,支持依赖注入 | 需手动创建和管理 |
| 配置方式 | 通过属性直接配置(如 setCorePoolSize()) | 需通过构造函数传递复杂参数 |
| 生命周期管理 | 支持 start() 和 shutdown() | 需手动调用 shutdown() |
| 任务装饰器 | 支持 TaskDecorator 传递上下文 | 无内置支持 |
| 与 Spring 生态集成 | 无缝支持 @Async、@Scheduled | 需自行封装 |
最佳实践
- 合理设置线程池参数
- CPU 密集型任务:核心线程数 ≈ CPU 核心数
- I/O 密集型任务:核心线程数 ≈ CPU 核心数 * 2,并增大队列容量。
- 避免队列无限堆积
设置合理的 queueCapacity,防止内存溢出(OOM)。 - 统一异常处理
通过 AsyncUncaughtExceptionHandler 捕获异步任务中的异常:
@Configurationpublic class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// ... 配置参数return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) -> {// 处理异常};}}
- 关闭时等待任务完成
应用退出时,调用 shutdown() 并等待剩余任务执行完毕:
executor.shutdown();try {if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {executor.shutdownNow();}} catch (InterruptedException e) {executor.shutdownNow();}
总结
ThreadPoolTaskExecutor 是 Spring 生态中管理线程任务的利器,通过灵活的配置和与 Spring 的无缝集成,能够高效处理异步任务、高并发请求和定时调度。合理设置参数、选择拒绝策略,并结合监控手段,可显著提升系统性能和稳定性。
相关文章:
【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理
ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类,基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展,支持更灵活的配置,并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...
C#:LINQ学习笔记01:LINQ基础概念
一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...
爬虫系列之发送请求与响应《一》
一、请求组成 1.1 请求方式:GET和POST请求 GET:从服务器获取,请求参数直接附在URL之后,便于查看和分享,常用于获取数据和查询操作 POST:用于向服务器提交数据,其参数不会显示在URL中,而是包含在…...
【零基础到精通Java合集】第十集:List集合框架
课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...
小米手机如何录制屏幕?手机、电脑屏幕录制方法分享
大家最近有没有遇到想记录手机屏幕操作的情况? 比如精彩的游戏瞬间、有趣的视频教程,或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手,今天就来给你好好唠唠,小米手机如何录制屏幕,以及后续如何处理这…...
【RTC】 TM32 RTC(实时时钟)库函数 配置
1. 硬件配置 与HAL库相同,需确保以下硬件条件: 外部低速晶振(LSE,32.768kHz)连接至 OSC32_IN 和 OSC32_OUT 引脚。 备用电池(VBAT)已连接,确保断电时RTC持续运行。 2. 标准外设库(库函数)配置步骤 2.1 初始化RTC时钟源 #include "stm32f10x.h" #include…...
策略模式的C++实现示例
核心思想 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改…...
deepseek、腾讯元宝deepseek R1、百度deepseekR1关系
分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...
Leetcode 面试150题(三)
一、题目 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &am…...
3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!
在当今数字化时代,工业领域的工程应用不断向基于Web的方向发展,而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集,正发挥着日益重要的作用,成为构建强大工程应用的基石。 一、HOOPS Web平台概述 HOOPS Web…...
python爬虫:python中使用多进程、多线程和协程对比和采集实践
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 多进程爬虫1.1 python多进程样例1.2 实现多进程爬虫2. 多线程爬虫2.1 python多线程样例2.2 实现多线程爬虫3. 协程爬虫3.1 python协程样例3.2 实现协程爬虫在网络爬虫中,为了提高抓取效率,常常需要使用多进程、多线…...
从 JVM 源码(HotSpot)看 synchronized 原理
大家好,我是此林。 不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。常常会想:真的是这样吗? 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…...
深入探索Python机器学习算法:模型调优
深入探索Python机器学习算法:模型调优 文章目录 深入探索Python机器学习算法:模型调优模型调优1. 超参数搜索方法1.1 网格搜索(Grid Search)1.2 随机搜索(Random Search)1.3 贝叶斯优化(Bayesia…...
windows 上删除 node_modules
在 Windows 11 上,你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤: 删除 node_modules 打开命令提示符(Command Prompt)或终端(PowerShell)。 导航到项目目录。你可以使用 …...
postman请求后端接受List集合对象
后端集合 post请求,即前端请求方式...
Kimi“撞车”DeepSeek!新一代注意力机制的极限突破!
近期,各方大佬在注意力机制上又“打起来了”。首先登场的是顶流DeepSeek,新论文梁文锋署名,提出了一种新的注意力机制NSA。同天,Kimi杨植麟署名的新注意力架构MoBA开源。紧接着,华为诺亚提出高效选择注意力架构ESA。 …...
如何在Android中实现服务(Service)
在Android中,Service 是一种用于在后台执行长时间运行操作而不提供用户界面的组件。Service 可以执行各种后台任务,如下载文件、播放音乐、执行定时任务等。以下是如何在Android中实现Service的基本步骤: 1. 创建一个Service类 首先&#x…...
计算机网络---SYN Blood(洪泛攻击)
文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…...
Ollama存在安全风险的情况通报及解决方案
据清华大学网络空间测绘联合研究中心分析,开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛,多数用户使用Ollama私有化部署且未修改默认配置,存在数据泄露、算力盗…...
视频流畅播放相关因素
视频播放的流畅度是一个综合性问题,涉及从视频文件本身到硬件性能、网络环境、软件优化等多个环节。以下是影响流畅度的关键因素及优化建议: 一、视频文件本身 1. 分辨率与帧率 1.问题:高分辨率(如4K)或高帧率&#…...
蓝桥杯试题:二分查找
一、问题描述 给定 n 个数形成的一个序列 a,现定义如果一个连续子序列包含序列 a 中所有不同元素,则该连续子序列便为蓝桥序列,现在问你,该蓝桥序列长度最短为多少? 例如 1 2 2 2 3 2 2 1,包含 3 个不同的…...
机器人训练环境isaac gym以及legged_gym项目的配置问题
完整的安装环境教程(强烈推荐):...
Qt QOCI driver available but not loaded(可用但未加载)
参考Linux Qt 6安装Oracle QOCI SQL Driver插件(适用WSL),根据SQL Database Drivers成功将libqsqloci.so、qsqloci.debug等文件安装到/opt/Qt6.8.2/6.8.2/gcc_64/plugins/sqldrivers后,运行Qt程序并尝试连接数据库时仍然报错 QSql…...
健康医疗大数据——医疗影像
一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域,通过实训培养团队成员对医疗大数据处理和分析的实际…...
学生管理信息系统的需求分析与设计
伴随教育的迅猛演进以及学生规模的不断扩增,学生管理信息系统已然成为学校管理的关键利器。此系统能够助力学校管控学生的课程成绩、考勤记载、个人资讯等诸多数据,提升学校的管理效能与服务品质。 一.需求分析 1.1 学生信息管理 学生信息在学校管理体…...
基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...
【AI深度学习基础】NumPy完全指南终极篇:核心功能与工程实践(含完整代码)
NumPy系列文章 入门篇进阶篇终极篇 一、引言 在完成NumPy入门篇的基础认知与进阶篇的特性探索后,我们终于迎来这场终极技术深潜。本文不再停留于API使用层面,而是直指NumPy的架构内核与高性能工程实践的本质矛盾。作为Python科学计算领域的基石&#…...
前端小案例——520表白信封
前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...
【最后203篇系列】010 关于矩阵的一点思考
说明 今天拿起一本矩阵的书又翻了翻,毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的,就打算这一年慢慢把矩阵部分扫一遍,毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了,哈哈。 内容 今…...
Python快捷手册
Python快捷手册 后续会陆续更新Python对应的依赖或者工具使用方法 文章目录 Python快捷手册[toc]1-依赖1-词云小工具2-图片添加文字3-BeautifulSoup网络爬虫4-Tkinter界面绘制5-PDF转Word 2-开发1-多线程和队列 3-运维1-Requirement依赖2-波尔实验室3-Anaconda3使用教程4-CentO…...
