Spring 线程池使用

多线程通信(二)线程阻塞与多线程计数器 一、介绍: 1、java为顺序执行代码,如 package com.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @RequestMapping("/test" 阅读详情
Spring 线程池使用
/**
*
*/
一个日志管理的类:
在批理更新,插入,等操作
package com.xiu.order.core.orders.impl;

import java.util.List;

import org.springframework.core.task.TaskExecutor;

import com.xiu.common.dao.persistence.exception.DAOException;
import com.xiu.order.core.exception.ManagerException;
import com.xiu.order.core.orders.LogManager;
import com.xiu.order.dal.orders.dao.LogDAO;
import com.xiu.order.dal.orders.dataobject.LogDO;

public class LogManagerImpl implements LogManager {

private LogDAO operatorLogDAO;

public LogDAO getOperatorLogDAO() {
return operatorLogDAO;
}

public void setOperatorLogDAO(LogDAO operatorLogDAO) {
this.operatorLogDAO = operatorLogDAO;
}

private TaskExecutor taskExecutor;

public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}

@Override
public List<LogDO> queryOperatorLog(int orderId) throws ManagerException {
try {
return operatorLogDAO.queryOperatorLog(orderId);
} catch (DAOException e) {
throw new ManagerException(e);
}
}

@Override
public int insertOperatorLog(LogDO operationLogDO) throws ManagerException {
try {
return operatorLogDAO.insertOperatorLog(operationLogDO);
} catch (DAOException e) {
throw new ManagerException(e);
}
}

@Override
public List<LogDO> queryOperatorLogList(LogDO operationLogDO)
throws ManagerException {
try {
return operatorLogDAO.queryOperatorLogList(operationLogDO);
} catch (DAOException e) {
throw new ManagerException(e);
}
}

public void batchAddOptLogAsync(final List<LogDO> optLogDOList)
throws ManagerException {
taskExecutor.execute(new Runnable() {
public void run() {
try {
operatorLogDAO.batchAddOptLogAsync(optLogDOList);
} catch (DAOException e) {
// System.out.println(e);
}
}
});
}

@Override
public void addOptLogAsync(final LogDO optLogDO) throws ManagerException {
taskExecutor.execute(new Runnable() {
public void run() {
try {
insertOperatorLog(optLogDO);
} catch (ManagerException e) {
e.printStackTrace();
}
}
});
}

@Override
public List<Integer> queryLogInfoByOrderIdListAndLogInfo(
List<Integer> orderIdList, LogDO oprationLogDO)
throws ManagerException {
try {
return operatorLogDAO.queryLogInfoByOrderIdListAndLogInfo(
orderIdList, oprationLogDO);
} catch (DAOException e) {
throw new ManagerException(e);
}
}
}
spring 配置

        <bean id="operatorLogManager"              class="com.xiu.order.core.orders.impl.LogManagerImpl ">
<property name="taskExecutor" ref="taskExecutor"></property>
</bean>

    <bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="30" />
</bean>


<转>
最近,由于项目里需要用到线程池来提高处理速度,记录一下spring的taskExecutor执行器来实现线程池。

这里省略了Service接口的定义和在applicationContext.xml文件中配置相应的bean(service)。

1、处理器实现类



Java代码 
1.package com.shine.job; 
2. 
3.import java.util.List; 
4. 
5.import org.apache.commons.logging.Log; 
6.import org.apache.commons.logging.LogFactory; 
7.import org.springframework.core.task.TaskExecutor; 
8. 
9.import com.shine.service.Service; 
10. 
11./**
12. *  处理器接口实现类
13. */ 
14.public class ProcessorImpl implements Processor { 
15. 
16.    // 日志对象 
17.    private static Log logger = LogFactory.getLog(ProcessorImpl.class); 
18.     
19.    // 执行器 
20.    private TaskExecutor taskExecutor; 
21.     
22.    // 业务接口 
23.    private Service service; 
24. 
25.    public void process() { 
26.            // 使用多线程处理 
27.            taskExecutor.execute(new Runnable(){ 
28.                public void run() { 
29.                    try { 
30.                        logger.debug("[Thread " 
31.                        + Thread.currentThread().getId() 
32.                        + " start]"); 
33.                        // 业务处理 
34.                        service.handle(name); 
35.                        logger.debug("[Thread " 
36.                        + Thread.currentThread().getId() 
37.                        + " end]"); 
38.                    } catch (RuntimeException e) { 
39.                        logger.error("Service handle exception",e); 
40.                    } 
41.                } 
42.            }); 
43.        } 
44.    } 
45.     
46.    public void setService(Service service) { 
47.        this.service = service; 
48.    } 
49. 
50.    public void setTaskExecutor(TaskExecutor taskExecutor) { 
51.        this.taskExecutor = taskExecutor; 
52.    } 
53.     
54.} 


2、applicationContext.xml配置



Xml代码 
1.<!--  线程池(执行器) -->  
2.<task:executor id="taskExecutor" pool-size="1-4" queue-capacity="128" />  
3. 
4.<!--  处理接口  -->  
5.<bean id="processor" class="com.shine.job.ProcessorImpl"> 
6.      <property name="service" ref="service" />  
7.      <property name="taskExecutor"> 
8.        <ref bean="taskExecutor" />  
9.      </property> 
10.</bean> 


其中:
pool-size="1-4",表示线程池活跃的线程数为1,最大线程数为4;
queue-capacity="128",表示任务队列的最大容量。

PS:关于taskExecutor还有一种配置bean来实现的,其配置的写法和参数与上面基本一致。


ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下ThreadPoolExecutor的配置,名字差不多,应该含义也差不多。只不过ThreadPoolTaskExecutor对
ThreadPoolExecutor做了包装。

<bean id ="taskExecutor"  class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
     <property name ="corePoolSize" value ="5" />
    <property name ="keepAliveSeconds" value ="300" />
    <property name ="maxPoolSize" value ="10" />
    <property name ="queueCapacity" value ="25" />
  </bean> 线程的配置文件:

corePoolSize: 线程池维护线程的最少数量

keepAliveSeconds  线程池维护线程所允许的空闲时间

maxPoolSize   线程池维护线程的最大数量

queueCapacity 线程池所使用的缓冲队列

当一个任务通过execute(Runnable)方法欲添加到线程池时:

l  如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

l  如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

l  当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

Spring中的线程池 前言:   Java SE 5.0引入了ThreadPoolExecutor、ScheduledThreadPoolExecutor。Spring 2.x借助ConcurrentTaskExecutor和ThreadPoolTaskExecutor能够通过IoC配置形式自定义它们暴露的各个属性。   多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了... 阅读详情

相关推荐

做小程序支付时,我是怎么被“虚拟支付”绊了一跤的

微信小程序支付开发中,普通支付与虚拟支付存在本质差异。开发者常误将虚拟权益(会员、点数等)当作普通商品支付,导致审核失败。两者在审核关注点、结算方式、API调用及平台政策上都截然不同。关键点在于:1)先明确交易对象类型;2)产品命名需真实反映权益性质;3)支付成功≠业务完成;4)审核说明要详细描述交付逻辑;5)避免依赖过时规则。正确顺序应是:判断商品属性→选择支付类型→设计订单系统→准备审核材料。这个认知差异比技术实现更重要,提前理解平台规则可大幅减少返工。

zhurizhe71的学习之路 2584

org.springframework.core.task.TaskRejectedException

org.springframework.core.task.TaskRejectedException一、问题二、现象三、原因四、解决办法四、参考链接 一、问题 "Unexpected error occurred in scheduled task.↵org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@41fbf07a[Running, pool siz

chen_heng_Ali的博客 2848

当预编译包失效时:手把手教你在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu

本文详细指导在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu的全流程,解决预编译包兼容性问题。涵盖环境准备、工具链配置、源码编译、常见问题解决及性能优化技巧,帮助开发者在边缘计算设备上实现高效AI模型推理。

weixin_29062823的博客 135

Spring的任务执行器(TaskExecutor)和任务调度器(TaskScheduler)

一、任务执行和调度(Task Execution and Scheduling) 1、介绍 Spring框架使用TaskExecutor和TaskScheduler接口分别为异步执行和任务调度提供抽象。 Spring还提供了那些接口的实现,这些接口在应用服务器环境中支持线程池或委托给CommonJ。 最终,在公共接口背后使用这些实现抽象出了Java SE 5、Java SE 6...

陈自选的博客 8321

QT项目实战:如何在正点原子Linux开发板上集成CVR-100UC身份证阅读器(附完整代码)

本文详细介绍了在正点原子Linux开发板上集成CVR-100UC身份证阅读器的完整实战流程。内容涵盖驱动适配、库文件部署、QT项目框架搭建、核心功能封装以及界面集成,并提供了完整的代码示例,帮助开发者快速实现嵌入式环境下的身份证信息读取功能。

yyy34的博客 258

EETI_eGTouch驱动移植及校准

一.环境 芯片:NXP IMX6Q 内核版本:4.1.15 uname:Linux myimx6ek314 4.1.15-myimx6-g5d588fa6-dirty #4 SMP PREEMPT Tue Nov 17 17:26:34 CST 2020 armv7l armv7l armv7l GNU/Linux 二.官方《EETI_eGTouch_Linux_Programming_Guide_v2.5l.pdf》文档勘误 HID_MULTITOUCH =Y or N(官方文档设置为M): 正确设置H

Garden的博客 4334

org.springframework.core.task.TaskRejectedException 异常

具体错误信息如下: 2022-01-25 00:00:00.094 [SockJS-3] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task. org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@3c5e6177[Ru

myinsert的博客 6668

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

taskExecutor使用

applicationContext.xml: <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10" /> <property name="maxPoolSize" value="50" /> .

u012045045的博客 1668

188、LLC谐振变换器的样机调试实战(EMI测试)

本文分享了LLC谐振变换器EMI调试的实战经验。作者通过300W电源案例,指出LLC的EMI问题主要来自谐振腔共模电流和死区振铃,并提出三板斧解决方案:优化功率回路布局、合理选择共模电感、正确配置X/Y电容。文章详细分析了谐振电容位置、MOSFET走线、变压器屏蔽等关键设计要点,并列举示波器探头、滤波器接地等常见误区。最后强调EMI调试70%依赖布局优化,建议预扫测试、数据记录并保留6dB余量。全文以实际案例贯穿,为LLC电源EMI设计提供了实用指导。

Jack010169的博客 57

168、运动控制中的标定:编码器零点标定

文章摘要 运动控制系统中的编码器零点标定是确保精确控制的关键基础步骤。文章通过实际案例说明,即使0.3度的零点偏移也会导致电机异常抖动。详细介绍了三种标定方法:反电动势法(需示波器)、电流注入法(适合量产)和霍尔传感器法(粗标定),并指出常见陷阱如忽略极对数、Z脉冲重复性问题和温度漂移。提供了基于STM32的嵌入式实现代码片段,强调标定后的静态、动态和负载验证的重要性。作者建议量产产品设置自动标定工位,研发样机采用更精确的方法,并强调标定数据应与电机序列号绑定。

m0_50546716的博客 137

Spring线程池ThreadPoolTaskExecutor的使用

文章目录1 简介2 示例2.1 线程池配置类2.2 异步方法2.3 启动测试 1 简介 Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor, 还得需要使用@EnableAsync开启异步,并通过在需要的异步方法那里使用注解@Async声明是一个异步任务 Spring 已经实现的异常线程池: SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创

上善若泪 5万+

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 643

spring 的线程池还是 java 的线程池

Java 提供了一个强大的并发库,其中包含了线程池的基本实现。线程池是接口的实现类,用于管理线程的创建、执行和终止。通过线程池,开发者可以避免频繁创建和销毁线程带来的开销,从而提升应用程序的性能。Spring 框架对 Java 的并发库进行了封装,使得线程池的配置更加简洁和灵活。Spring 提供了接口,这是对 JavaExecutor接口的扩展,允许开发者更容易地配置和管理线程池。Spring 的线程池配置通常通过 XML 或 Java 配置类来实现,并且 Spring 提供了多种实现,如等。

Flying_Fish_roe的博客 1674

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring线程池与JDK线程池配置

在web开发项目中,处理任务的线程池或多或少会用到。如果项目中使用到了spring,使用线程池时就可以直接使用spring自带的线程池了。下面是Spring线程池与JDK线程池的使用实例,做个参考吧。 //直接在代码中使用 public static void main(String[] args) throws InterruptedException, ExecutionExcept

孟飞阳的专栏 1925

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring Boot 使用Spring的异步线程池

前言 线程池,从名字上来看,就是一个保存线程的"池子",凡事都有其道理,那线程池的好处在哪里呢? 我们要让计算机为我们干一些活,其实都是在使用线程,使用方法就是new一个Runnable接口或者新建一个子类,继承于Thread类,这就会涉及到线程对象的创建与销毁,这两个操作无疑是耗费我们系统处理器资源的,那如何解决这个问题呢? 线程池其实就是为了解决这个问题而生的。 线程池提供了处理系统性能和大用...

阳光大男孩!!!的博客 1471

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring框架中的线程池

ExecutorService是Java提供的用于管理线程池的高级工具。

m0_71777195的博客 3823

Spring框架如何高效的使用线程池

线程池是一种强大的并发编程工具,它可以帮助我们提高系统性能和资源利用率。然而,在使用线程池时,需要注意合理设置参数、选择合适的任务队列策略、避免资源竞争和死锁等问题。通过对线程池的监控和调优,我们可以充分发挥线程池的优势,提高系统的整体性能。​​。

1271

async spring 默认线程池_spring @Async 线程池使用

最近公司项目正逐渐从dubbo向springCloud转型,在本次新开发的需求中,全部使用springcloud进行,在使用时线程池,考虑使用spring封装的线程池,现将本次使用心得及内容记录下来一、线程池常规使用方式之前使用线程池的方式,都是自己定义线程池,然后写多线程类,用线程池去调用,如下:packagecn.leadeon.message.client;importcn.leadeon....

weixin_42132354的博客 619

Spring异步线程池的问题

尽管Spring Boot提供了默认的线程池配置,但在实际应用中,根据业务需求和系统负载,这些默认配置可能需要调整。开发者可以通过在或文件中添加相应的配置属性来自定义线程池的行为。

qq_42704130的博客 1582

Spring配置线程池详解

定义一个异步服务接口,并在实现类中使用@Async注解标注异步执行的方法。@Service@OverrideSystem.out.println("当前运行的线程名称:" + Thread.currentThread().getName());通过合理配置和使用线程池,我们可以显著提高Spring应用的性能和响应速度。Spring提供的线程池配置方式简单而强大,使得开发者可以轻松地管理和优化线程资源。掌握这些配置和使用方法,将有助于我们更好地构建高效、稳定的Java应用。版权声明。

ning的博客 3457

java 线程池 spring_spring 线程池和java线程池

jdk线程池就是使用jdk线程工具类ThreadPoolExecutor 创建线程池spring线程池就是使用自己配置的线程池,然后交给spring处理,可以采用Async,也可以引入线程池的bean依赖。记一下线程池优化不当导致的资源耗尽原本接口业务逻辑ExecutorService executorService = Executors.newFixedThreadPool(10);Count...

weixin_31600859的博客 450

Spring Boot中异步线程池@Async

自定义线程池,可对系统中线程池更加细粒度的控制,方便调整线程池大小配置,线程执行异常控制和处理。在设置系统自定义线程池代替默认线程池时,虽可通过多种模式设置,但替换默认线程池最终产生的线程池有且只能设置一个(不能设置多个类继承 AsyncConfigurer)。重新实现接口 AsyncConfigurer;继承 AsyncConfigurerSupport;配置由自定义的 TaskExecutor 替代内置的任务执行器。

运气只是当机会来临时,你已为它准备好。 2582

spring 线程池_Spring线程池服务

spring 线程池 线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 : JDK 1.6.0_21 春天3.0.5 Maven的3.0.2 步骤1:建立已完成的专案 创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件创建)。 步骤2:图书馆 Spri...

最佳 Java 编程 258

java 线程池 spring_spring 配置线程池

一,环境 spring mvc 4.3.10二,spring配置文件class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">三,使用方法import org.springframework.beans.factory.annotation.Autowired;import org.springframe...

weixin_42509293的博客 384
上一篇: 线程堵塞
下一篇: 特殊的队列:BlockingQueue 使用(转)
rainyear
博客等级 码龄18年 55粉丝 333原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值