Spring中线程池ThreadPoolTaskExecutor的使用

一、为什么要使用线程池

  在项目中使用多线程时,通常建议使用线程池而不是直接使用 new Thread 的方式来创建线程。下面是一些原因:

  • 资源管理和性能优化: 使用线程池可以更好地管理系统资源,控制并发线程数,避免创建过多的线程导致资源耗尽或者竞争。线程池可以根据系统负载和需求动态调整线程数量,从而更好地利用资源,提高性能。
  • 线程复用: 线程池中的线程可以被复用,避免了线程创建和销毁的开销,可以提高执行效率。
  • 任务队列管理: 线程池通常有任务队列,可以存储等待执行的任务,当有空闲线程时立即执行任务,避免任务阻塞或等待时间过长。
  • 线程生命周期管理: 线程池能够管理线程的生命周期,包括创建、执行、销毁等,更加方便和可控。

二、ThreadPoolTaskExecutor概述

  ThreadPoolTaskExecutor 是 Spring 框架提供的一个实现了 Executor 和 AsyncTaskExecutor 接口的线程池任务执行器。它是 Spring 提供的内置线程池实现,用于在应用程序中管理线程池并执行异步任务。
  ThreadPoolTaskExecutor 具有一些常用的线程池配置属性,例如核心线程数、最大线程数、线程池队列容量、空闲线程的存活时间等,可以根据应用程序的需求进行灵活的配置。

三、在Spring中配置线程池

@Configuration
public class ThreadPoolTaskConfig {// 核心线程数(默认线程数) private static final int CORE_POOL_SIZE = 20;// 最大线程数 private static final int MAX_POOL_SIZE = 100;// 允许线程空闲时间(单位:默认为秒) private static final int KEEP_ALIVE_TIME = 10;// 缓冲队列大小 private static final int QUEUE_CAPACITY = 200;// 线程池名前缀 private static final String THREAD_NAME_PREFIX = "my-Async-";@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名public ThreadPoolTaskExecutor taskExecutor(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(CORE_POOL_SIZE);executor.setMaxPoolSize(MAX_POOL_SIZE);executor.setQueueCapacity(QUEUE_CAPACITY);executor.setKeepAliveSeconds(KEEP_ALIVE_TIME);executor.setThreadNamePrefix(THREAD_NAME_PREFIX);// 线程池对拒绝任务的处理策略// CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 初始化executor.initialize();return executor;}
}

四、多线程实现示例

4.1 调用execute()和submit()方法

@Resource(name = "taskExecutor")
private ThreadPoolTaskExecutor taskExecutor;public void doTask() throws Exception {//execute方法taskExecutor.execute(() -> testResult());//submit方法Future<Integer> submit = taskExecutor.submit(() -> testResult());System.out.println(submit.get());
}public static Integer testResult() {return 10;
}

  execute 方法是 Executor 接口中定义的方法,它只能执行 Runnable 任务,并且没有返回值。如果任务执行失败,你无法得到任何有用的信息。
  submit 方法是 ExecutorService 接口中定义的方法,它可以执行 Runnable 任务或者 Callable 任务,并且它会返回一个 Future 对象,通过 Future 对象你可以获得任务执行的结果或者异常信息。
  基本上来说,submit 方法比 execute 方法更加灵活和功能更加完善。如果你需要获取任务执行的结果,或者需要更好地处理任务执行时可能出现的异常,建议使用 submit 方法。

4.2 使用@Async来实现异步方法调用

  @Async 是一个注解,用于指示方法应该以异步方式执行。它是 Spring 框架提供的一个特性,可以方便地实现异步方法调用。
  当使用 @Async 注解标记一个方法时,Spring 将会创建一个线程池或者使用默认的线程池来执行该方法。这样,方法将会在一个单独的线程中异步执行,而不会阻塞当前线程。
  要使 @Async 注解生效,还需要在 Spring 配置中启用异步支持。你可以通过在配置类上添加@EnableAsync注解来实现

@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {......
}

  通过上述配置,Spring 将会在启动时自动扫描使用@Async 注解的方法,并为其创建相应的代理,从而实现异步执行。

@Async("taskExecutor")
public void doTask() throws Exception {log.info("开始做任务");long start = System.currentTimeMillis();Thread.sleep(5000);long end = System.currentTimeMillis();log.info("完成任务,耗时:" + (end - start) + "毫秒");
}
@Autowired
public AsyncTask asyncDemo;@GetMapping("/async")
public void getResult() throws Exception {for (int i = 0; i < 5; i++) {asyncDemo.doTask();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…

k8s的存储卷

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消…

获取直播间的最新评论 - python 取两个list的差集

python 取两个list的差集 作用&#xff1a;比如我要获取评论区列表&#xff0c;先获取了一遍&#xff0c;这个时候有人评论了几条&#xff0c;我再获取一遍后&#xff0c;找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…

微信公众号——微信公众号实现发送模板消息

准备工作 在调用微信接口获取AccessToken时&#xff0c;需要使用到微信公众号的appid及appsecret&#xff0c;获取方式如下&#xff1a; 1.已有公众号 已有公众号&#xff1a; 有属于自己的公众号账户&#xff0c;登录微信公众平台(https://mp.weixin.qq.com)&#xff0c;在…

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能&#xff0c;和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器&#xff0c;片上包含精度为 1%以内的 20MHz/40MHz 时钟&#xff0c;最…

起诉业务员飞单需要什么证据?

在商业活动中&#xff0c;业务员飞单是一种常见的违规行为&#xff0c;给企业带来了巨大的经济损失。如果企业怀疑业务员存在飞单行为&#xff0c;需要收集足够的证据来证明其行为&#xff0c;并采取法律手段维护企业的合法权益。那么&#xff0c;起诉业务员飞单需要什么证据呢…

【数据库原理】(19)在实际数据库设计中关系规范化的应用

一.关系规范化的基本原则 1. 规范化的目的和基本思想 目的&#xff1a;通过分解低一级范式的关系模式&#xff0c;转换为高一级范式的关系模式集合&#xff0c;以减少数据冗余和更新异常。 基本思想&#xff1a; “一事一地”&#xff1a;确保每个关系模式只描述一个概念、实…

odoo17 | 视图操作按钮

前言 到目前为止&#xff0c;我们主要通过声明字段和视图来构建我们的模块。在上一章中&#xff0c;我们刚刚通过计算字段和onchanges引入了业务逻辑。在任何真实的业务场景中&#xff0c;我们都会希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中&#xff0c;我们希望…

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素 文章目录 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素1 数组理论基础&#xff08;基于面试&#xff09;1.1 面试问题针对 Python1.2 面试问题针对 C 2 LeetCode 704.二分查找2.1 二分查找的实现2.2 P…

Buzz 离线音频转字幕工具(完全免费,无需登录)

关于 Buzz Buzz 是一款可以自动识别语音为文本字幕的软件工具&#xff0c;基于 OpenAI 开源的 Whisper 自动语音识别模型&#xff0c;可以批量将音频或者是视频中的内容自动转化为带有时间的字幕&#xff0c;速度非常快&#xff0c;是一款能极大提高效率的生产力小工具。 Bu…

JavaScript-对象-笔记

1.字面量创建对象、对象的使用 对象就是一组 属性和方法的集合 属性&#xff1a; 特征 相当于变量 静态 是什么 方法&#xff1a; 行为 相当于函数 动态 干什么 创建对象 创建对象的第一种&#xff1a;使用字面量 {} 对象中的元素是键值对 使用逗号隔开 键:值 的形式 var 对象名…

Vue项目在ie浏览器中显示白屏优化提示

在工作中用到Vue开发项目&#xff0c;用户在IE浏览器打开页面&#xff0c;结果显示空白屏。作为开发者当然知道是浏览器版本过低导致语法不支持&#xff0c;但是用户不知情的情况下显示空白屏就很不友好。这时候有必要在页面上做点提示语告诉用户切换浏览器&#xff0c;下面是页…

千里之行始于足下,2024年低代码数字化选型“避坑指南“

千里之行&#xff0c;始于足下。企业数字化转型建设之路&#xff0c;亦始于选型。 在转型建设的过程中&#xff0c;数字化系统的选型往往被视为最关键的环节。一旦选型不当或出现失误&#xff0c;可能导致项目进展受阻&#xff0c;甚至直接导致项目失败。因此&#xff0c;一个良…

社交距离 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。 满足:每当一个员工进入时,…

Edge扩展插件如何安装位置?

Edge浏览器的扩展插件安装后&#xff0c;它们的相关文件通常存储在以下位置&#xff1a; 在Windows操作系统上&#xff1a; plaintext %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Extensions 这个路径会根据用户的配置和系统版本有所不同。%LOCALAPPDATA% 是一个环境变…

PyTorch简单易懂的解析 Dropout Layers应用,代码示例

目录 torch.nn子模块Dropout Layers详解 nn.Dropout 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout1d 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout2d 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout3d 用途 用法 使用技巧 注意事项 代码…

【算法专题】动态规划之斐波那契数列模型

动态规划1.0 动态规划 - - - 斐波那契数列模型1. 第 N 个泰波那契数2. 三步问题3. 使用最小花费爬楼梯4. 解码方法 动态规划 - - - 斐波那契数列模型 1. 第 N 个泰波那契数 题目链接 -> Leetcode -1137. 第 N 个泰波那契数 Leetcode -1137. 第 N 个泰波那契数 题目&…

git如何仅合并项目下的某个文件夹

前言 假设目前在做的一个项目名为demoproject&#xff0c;目前版本为v1.0.0&#xff0c;标准开发都是在demoproject上进行的&#xff0c;但是有一个客户需要做定制化&#xff0c;需要将项目中的一些信息改为客户的&#xff0c;于是基于demoproject拉了一个v1.0.0-custom&#…

Unity C# 异步编程模式之等待直到完成模式(wait-until-done模式)

Unity的协程使用的就是wait-until-done模式&#xff0c;下面放上完整代码&#xff1a; using UnityEngine; using System.Threading; using System;delegate int MyDel(int first, int second);//声明委托类型public class AsyncWaitUntilDoneDemo : MonoBehaviour {void Star…

RabbitMQ解决消息丢失以及重复消费问题

文章目录 1、概念2、基于ACK/NACK机制2.1 基于Spring AMQP框架整合ACK/NACK机制2.2 测试消费失败1.02.3 测试结果1.02.4 测试MQ宕机2.5 测试结果2.0 3、RabbitMQ 如何实现幂等性设计3.1 幂等服务设计思路3.1.1 通过雪花算法生成分布式唯一ID3.1.2 通过枚举类&#xff0c;设计Me…