Spring中线程池的应用

多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说如何使用spring来处理并发事务:

 

1.了解 TaskExecutor接口

Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。最初创建TaskExecutor是为了在需要时给其他Spring组件提供一个线程池的抽象。 例如ApplicationEventMulticaster组件、JMS的 AbstractMessageListenerContainer和对Quartz的整合都使用了TaskExecutor抽象来提供线程池。 当然,如果你的bean需要线程池行为,你也可以使用这个抽象层。

 

2. TaskExecutor接口的实现类

(1)SimpleAsyncTaskExecutor 类

这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。

 

(2)SyncTaskExecutor类

这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。

 

(3)ConcurrentTaskExecutor 类

这个实现是对Java 5 java.util.concurrent.Executor类的包装。有另一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数作为bean属性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一个备选。

(4)SimpleThreadPoolTaskExecutor 类

这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。

(5)ThreadPoolTaskExecutor 类

它不支持任何对java.util.concurrent包的替换或者下行移植。Doug Lea和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包结构,导致它们无法正确运行。 这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它暴露的bean properties可以用来配置一个java.util.concurrent.ThreadPoolExecutor,把它包装到一个TaskExecutor中。如果你需要更加先进的类,比如ScheduledThreadPoolExecutor,我们建议你使用ConcurrentTaskExecutor来替代。

(6)TimerTaskExecutor类

这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。

(7)WorkManagerTaskExecutor类

这个实现使用了CommonJ WorkManager作为其底层实现,是在Spring context中配置CommonJ WorkManager应用的最重要的类。和SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。  

3.线程池Demo之 ThreadPoolTaskExecutor

(1)编写测试类

 

[java]   view plain copy
  1. import org.springframework.core.task.TaskExecutor;  
  2.   
  3. public class MainExecutor {  
  4.     private TaskExecutor taskExecutor;  
  5.     public MainExecutor (TaskExecutor taskExecutor) {      
  6.         this.taskExecutor = taskExecutor;    
  7.     }  
  8.     public void printMessages() {      
  9.         for(int i = 0; i < 25; i++) {        
  10.             taskExecutor.execute(new MessagePrinterTask("Message" + i));      
  11.         }    
  12.     }  
  13.       
  14.       
  15.     private class MessagePrinterTask implements Runnable {      
  16.         private String message;      
  17.         public MessagePrinterTask(String message) {        
  18.             this.message = message;      
  19.         }      
  20.         public void run() {        
  21.             System.out.println(message);      
  22.         }  
  23.     }  
  24. }  

 

在业务代码中,通常以for循环的方式执行多个事务
for(int k = 0; k < n; k++) {    
        taskExecutor.execute(new ThreadTransCode());    
    }
其它繁琐的线程管理的事情就交给执行器去管理。
值得注意的事有两点
1, taskExecutor.execute(new ThreadTransCode());  激活的线程都是守护线程,主线程结束,守护线程就会放弃执行,这个在业务中式符合逻辑的,在单元测试中为了看到执行效果,需要自行阻塞主线程。
2, taskExecutor.execute(new ThreadTransCode());    的执行也不是完全安全的,在执行的过程中可能会因为需要的线程查过了线程队列的容量而抛出运行时异常,如有必要需要捕获。


(2)spring的配置

 

[html]   view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd">  
  3. <beans>  
  4.   
  5.   <!-- 异步线程池 -->  
  6.   <bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
  7.     <!-- 核心线程数  -->  
  8.     <property name="corePoolSize" value="10" />  
  9.     <!-- 最大线程数 -->  
  10.     <property name="maxPoolSize" value="50" />  
  11.     <!-- 队列最大长度 >=mainExecutor.maxSize -->  
  12.     <property name="queueCapacity" value="1000" />  
  13.     <!-- 线程池维护线程所允许的空闲时间 -->  
  14.     <property name="keepAliveSeconds" value="300" />  
  15.     <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->  
  16.     <property name="rejectedExecutionHandler">  
  17.       <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />  
  18.     </property>  
  19.   </bean>  
  20.   
  21.   <bean id="mainExecutor" class="supben.MainExecutor">  
  22.     <property name="threadPool" ref="threadPool" />   
  23.   </bean>  
  24.   
  25.   <bean id="springScheduleExecutorTask" class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">  
  26.     <property name="runnable" ref="mainExecutor" />  
  27.     <!-- 容器加载10秒后开始执行 -->  
  28.     <property name="delay" value="10000" />  
  29.     <!-- 每次任务间隔 5秒-->  
  30.     <property name="period" value="5000" />  
  31.   </bean>  
  32.     
  33.     <bean id="springScheduledExecutorFactoryBean" class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">  
  34.     <property name="scheduledExecutorTasks">  
  35.       <list>  
  36.         <ref bean="springScheduleExecutorTask" />  
  37.       </list>  
  38.     </property>  
  39.   </bean>  
  40.   
  41. </beans>  

 

 

(3)调用

 

[java]   view plain copy
  1. ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");     
  2. MainExecutor te = (MainExecutor)appContext.getBean("taskExecutorExample");  
  3. te.printMessages();  
  4. System.out.println("11111111111111111111111");  

 

 

 

(4)效果

 

msfvenom制作windows/linux/android/ios木马 msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使 阅读详情

相关推荐

智能手环心率检测不准?用STM32+MAX30102教你实现医疗级精度(含算法优化)

本文详细解析了如何利用STM32微控制器和MAX30102光学传感器实现医疗级精度的心率检测方案。通过硬件参数调校、ADC采集优化、运动伪影消除及深度学习算法改进,显著提升智能手环在静态和运动状态下的检测精度,误差可控制在±1.5bpm以内,满足医疗电子标准。

weixin_28335283的博客 526

多线程知识总结

多线程知识总结

yangzhe19931117的博客 442

Fluent新手必看:如何正确解读scaled residuals曲线(附常见问题排查)

本文详细解析了Fluent中scaled residuals曲线的解读方法及常见问题排查技巧。针对continuity残差居高不下、湍流模型收敛困难等典型问题,提供了网格质量检查、边界条件验证和求解策略调整的实用解决方案,帮助CFD新手快速掌握计算收敛性的关键判断标准。

weixin_28698059的博客 377

Java 线程池

线程缺点: 线程的创建它会开辟本地方法栈、虚拟机栈、程序计数器成线程私有的内存,同时消耗的时候需要销毁以上3个区域,因此频繁的创建和消耗比较消耗系统资源 在任务量远远大于线程可以处理的任务量的时候,并不能友好拒绝任务 线程池: 定义:使用池化技术来管理线程和使用线程的方式 线程池有两个重要对象: 线程 工作队列(Integer 最大值) 优点: 可以避免频繁的创建和销毁线程 可以更好的管理线程的个数和资源的个数 线程池拥有更多的功能,比如线程池可以进行定时任务的执行 线程池可以更优化的拒

XKA_HRX的博客 399

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 427

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 267

Java多线程中调用Spring的Bean

目录一、背景二、方式一:实现ApplicationContextAware接口2.1、工具类2.2、发送短信服务类2.3、发送短信线程类2.4、发送短信测试三、方式二:线程内部构造方法3.1、发送邮件服务类3.2、发送邮件线程类3.3、发送邮件测试四、方式三:内部类(推荐)4.1、个性化服务类4.2、个性化服务类测试结语 一、背景   工作中我们想写个线程是很简单的,方式也很多,我在之前的文章Java实现多线程方式详解也介绍过,就不多讲了,但是实际工作中,尤其是采用spirng注解的方式的情况下,有时我们就

嘉禾嘉宁papa 1万+

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 644

Spring Bean方法的异步执行

@Configuration @EnableAsync public class ThreadPoolTaskConfig { private static final int corePoolSize = 10; // 核心线程数(默认线程数) private static final int maxPoolSize = 100; // 最大线程数 private static final int keepAliveTime = 10; // 允许线程空闲时间(.

不甘平庸的人 1490

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

【芯片设计- RTL 编译与仿真 1.2 -- Visualizer 常用使用命令】

打开波形后,如果想要看到所有信号的数据,可以点击下图中红框中的按钮,因为默认verdi 默认并不是显示所用信号。如果想统计某一个信号中有多少笔数据时,可以使用 Expression->Edege Count 功能。如下图所示,如果没有打开前导0的功能时,当某一笔数据位0时,只会显示1个0。如果需要将波形的数据导出到文本文件时,可以按照下面步骤进行。打开前导0功能之后,会根据数据位宽来显示对应0的个数。

CodingCos的博客 2047

【业务功能篇145】Spring项目中线程池实战应用各种场景ThreadPoolTaskExecutor

【业务功能篇 142】多线程池+Semaphore信号量 数据并行处理-优快云博客 【业务功能篇135】多线程+countDownLatch执行大数据量定时任务_countdownlantch 实现多个线程开始执行任务的最大并行性-优快云博客 线程池ThreadPoolTaskExecutor实战-优快云博客springboot线程池ThreadPoolTaskExecutor使用_threadpooltaskexecutor springboot-优快云博客

studyday1的博客 639

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 312

SpringBoot中线程池的应用

当其它系统调用我们的系统时,每个不同系统调用我们的接口都用不同的操作,因此引入线程池,对任务进行处理1.设置线程池参数。

m0_67737207的博客 322

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Boot中线程池使用

Spring Boot中线程池使用

小何的博客 1759

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Springboot项目中线程池使用整理

Spring环境:优先使用@Bean配置ThreadPoolTaskExecutor全局异步配置:实现AsyncConfigurer接口特殊性能要求:使用private static final方式。

2509_94005872的博客 563
上一篇: Spring线程池开发实战
下一篇: tomcat集群扩展session集中管理,Memcached-session-manager使用
danwind
博客等级 码龄19年 6粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值