当前位置: 首页 > article >正文

【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

拒绝策略(如 AbortPolicyCallerRunsPolicy

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());

监控与调试

  1. 获取线程池状态
    通过 ThreadPoolTaskExecutor 的方法监控线程池:
int activeCount = executor.getThreadPoolExecutor().getActiveCount();  // 活跃线程数long completedTaskCount = executor.getThreadPoolExecutor().getCompletedTaskCount();  // 已完成任务数
  1. 日志输出
    启用 Spring Boot Actuator 的 metrics 端点,或自定义监控逻辑。

与原生 ThreadPoolExecutor 对比

特性

ThreadPoolTaskExecutor

ThreadPoolExecutor

依赖管理

集成 Spring 容器,支持依赖注入

需手动创建和管理

配置方式

通过属性直接配置(如 setCorePoolSize()

需通过构造函数传递复杂参数

生命周期管理

支持 start()  shutdown()

需手动调用 shutdown()

任务装饰器

支持 TaskDecorator 传递上下文

无内置支持

Spring 生态集成

无缝支持 @Async@Scheduled

需自行封装


最佳实践

  1. 合理设置线程池参数
    • CPU 密集型任务:核心线程数 ≈ CPU 核心数
    • I/O 密集型任务:核心线程数 ≈ CPU 核心数 * 2,并增大队列容量。
  2. 避免队列无限堆积
    设置合理的 queueCapacity,防止内存溢出(OOM)。
  3. 统一异常处理
    通过 AsyncUncaughtExceptionHandler 捕获异步任务中的异常:
@Configurationpublic class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// ... 配置参数return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) -> {// 处理异常};}}
  1. 关闭时等待任务完成
    应用退出时,调用 shutdown() 并等待剩余任务执行完毕:
executor.shutdown();try {if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {executor.shutdownNow();}} catch (InterruptedException e) {executor.shutdownNow();}

总结

ThreadPoolTaskExecutor  Spring 生态中管理线程任务的利器,通过灵活的配置和与 Spring 的无缝集成,能够高效处理异步任务、高并发请求和定时调度。合理设置参数、选择拒绝策略,并结合监控手段,可显著提升系统性能和稳定性。

相关文章:

【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理

ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类&#xff0c;基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展&#xff0c;支持更灵活的配置&#xff0c;并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型&#xff1a;对对象、XML、数据库等不同数据源使用一致的语法。强类型检查&#xff1a;编译时类型安全&#xff0c;减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式&#xff1a;GET和POST请求 GET:从服务器获取&#xff0c;请求参数直接附在URL之后&#xff0c;便于查看和分享&#xff0c;常用于获取数据和查询操作 POST&#xff1a;用于向服务器提交数据&#xff0c;其参数不会显示在URL中&#xff0c;而是包含在…...

【零基础到精通Java合集】第十集:List集合框架

课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况&#xff1f; 比如精彩的游戏瞬间、有趣的视频教程&#xff0c;或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手&#xff0c;今天就来给你好好唠唠&#xff0c;小米手机如何录制屏幕&#xff0c;以及后续如何处理这…...

【RTC】 TM32 RTC(实时时钟)库函数 配置

1. 硬件配置 与HAL库相同,需确保以下硬件条件: 外部低速晶振(LSE,32.768kHz)连接至 OSC32_IN 和 OSC32_OUT 引脚。 备用电池(VBAT)已连接,确保断电时RTC持续运行。 2. 标准外设库(库函数)配置步骤 2.1 初始化RTC时钟源 #include "stm32f10x.h" #include…...

策略模式的C++实现示例

核心思想 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端&#xff0c;从而使得客户端可以根据需要动态切换算法&#xff0c;而不需要修改…...

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向&#xff1a; DeepSeek官网R1版本&#xff1a;作为基础版本&#xff0c;通常保留通用性设计&#xff0c;适用于广泛的AI应用场景&#xff08;如自然语言处理、数据分析等&#xff09;。其优势在于技术原生性和官方直接支持。腾讯元宝…...

Leetcode 面试150题(三)

一、题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &am…...

3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!

在当今数字化时代&#xff0c;工业领域的工程应用不断向基于Web的方向发展&#xff0c;而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集&#xff0c;正发挥着日益重要的作用&#xff0c;成为构建强大工程应用的基石。 一、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 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…...

深入探索Python机器学习算法:模型调优

深入探索Python机器学习算法&#xff1a;模型调优 文章目录 深入探索Python机器学习算法&#xff1a;模型调优模型调优1. 超参数搜索方法1.1 网格搜索&#xff08;Grid Search&#xff09;1.2 随机搜索&#xff08;Random Search&#xff09;1.3 贝叶斯优化&#xff08;Bayesia…...

windows 上删除 node_modules

在 Windows 11 上&#xff0c;你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤&#xff1a; 删除 node_modules 打开命令提示符&#xff08;Command Prompt&#xff09;或终端&#xff08;PowerShell&#xff09;。 导航到项目目录。你可以使用 …...

postman请求后端接受List集合对象

后端集合 post请求&#xff0c;即前端请求方式...

Kimi“撞车”DeepSeek!新一代注意力机制的极限突破!

近期&#xff0c;各方大佬在注意力机制上又“打起来了”。首先登场的是顶流DeepSeek&#xff0c;新论文梁文锋署名&#xff0c;提出了一种新的注意力机制NSA。同天&#xff0c;Kimi杨植麟署名的新注意力架构MoBA开源。紧接着&#xff0c;华为诺亚提出高效选择注意力架构ESA。 …...

如何在Android中实现服务(Service)

在Android中&#xff0c;Service 是一种用于在后台执行长时间运行操作而不提供用户界面的组件。Service 可以执行各种后台任务&#xff0c;如下载文件、播放音乐、执行定时任务等。以下是如何在Android中实现Service的基本步骤&#xff1a; 1. 创建一个Service类 首先&#x…...

计算机网络---SYN Blood(洪泛攻击)

文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议&#xff0c;平时我们使用的浏览器&#xff0c;APP等大多使用 TCP 协议通讯的&#xff0c;可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…...

Ollama存在安全风险的情况通报及解决方案

据清华大学网络空间测绘联合研究中心分析&#xff0c;开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛&#xff0c;多数用户使用Ollama私有化部署且未修改默认配置&#xff0c;存在数据泄露、算力盗…...

视频流畅播放相关因素

视频播放的流畅度是一个综合性问题&#xff0c;涉及从视频文件本身到硬件性能、网络环境、软件优化等多个环节。以下是影响流畅度的关键因素及优化建议&#xff1a; 一、视频文件本身 1. 分辨率与帧率 1.问题&#xff1a;高分辨率&#xff08;如4K&#xff09;或高帧率&#…...

蓝桥杯试题:二分查找

一、问题描述 给定 n 个数形成的一个序列 a&#xff0c;现定义如果一个连续子序列包含序列 a 中所有不同元素&#xff0c;则该连续子序列便为蓝桥序列&#xff0c;现在问你&#xff0c;该蓝桥序列长度最短为多少&#xff1f; 例如 1 2 2 2 3 2 2 1&#xff0c;包含 3 个不同的…...

机器人训练环境isaac gym以及legged_gym项目的配置问题

完整的安装环境教程(强烈推荐):...

Qt QOCI driver available but not loaded(可用但未加载)

参考Linux Qt 6安装Oracle QOCI SQL Driver插件&#xff08;适用WSL&#xff09;&#xff0c;根据SQL Database Drivers成功将libqsqloci.so、qsqloci.debug等文件安装到/opt/Qt6.8.2/6.8.2/gcc_64/plugins/sqldrivers后&#xff0c;运行Qt程序并尝试连接数据库时仍然报错 QSql…...

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…...

学生管理信息系统的需求分析与设计

伴随教育的迅猛演进以及学生规模的不断扩增&#xff0c;学生管理信息系统已然成为学校管理的关键利器。此系统能够助力学校管控学生的课程成绩、考勤记载、个人资讯等诸多数据&#xff0c;提升学校的管理效能与服务品质。 一.需求分析 1.1 学生信息管理 学生信息在学校管理体…...

基于微信小程序的停车场管理系统的设计与实现

第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展&#xff0c;各行各业都在摸索移动互联对本行业的改变&#xff0c;不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件&#xff0c;但是APP作为一个只为某个公司服务的一个软件&a…...

【AI深度学习基础】NumPy完全指南终极篇:核心功能与工程实践(含完整代码)

NumPy系列文章 入门篇进阶篇终极篇 一、引言 在完成NumPy入门篇的基础认知与进阶篇的特性探索后&#xff0c;我们终于迎来这场终极技术深潜。本文不再停留于API使用层面&#xff0c;而是直指NumPy的架构内核与高性能工程实践的本质矛盾。作为Python科学计算领域的基石&#…...

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

【最后203篇系列】010 关于矩阵的一点思考

说明 今天拿起一本矩阵的书又翻了翻&#xff0c;毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的&#xff0c;就打算这一年慢慢把矩阵部分扫一遍&#xff0c;毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了&#xff0c;哈哈。 内容 今…...

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…...