Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂

一、自定义线程工厂

自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口,重写newThread方法。
示例代码:

package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;/*** 业务自定义线程工程* @author wangt*/
public class BusinessThreadFactory implements ThreadFactory {private final Logger logger = Logger.getLogger(BusinessThreadFactory.class);// 线程组private final ThreadGroup group;// 线程序号private final AtomicInteger threadNumber = new AtomicInteger(1);// 线程名称前缀private final String namePrefix;public BusinessThreadFactory(String namePrefix) {SecurityManager securityManager = System.getSecurityManager();group = securityManager != null ? securityManager.getThreadGroup(): Thread.currentThread().getThreadGroup();this.namePrefix = namePrefix + "-thread-";}@Overridepublic Thread newThread(Runnable runnable) {Thread thread = new Thread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0);// 守护线程if (thread.isDaemon()) {// 将当前线程设置为守护线程,主线程结束时,当前线程也随之结束thread.setDaemon(true);}// 线程优先级if (thread.getPriority() != Thread.NORM_PRIORITY) {// 设置普通优先级thread.setPriority(Thread.NORM_PRIORITY);}// 处理未捕捉的异常thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {logger.error("异常:", e);}});return thread;}
}

二、applicationContext.xml配置自定义线程工厂及线程池

(一)自定义线程工厂配置

<!--自定义线程工厂-->
<bean id="businessThread" class="com.xiaobai.thread.BusinessThreadFactory" ><!--自定义线程工厂构造函数,参数为线程名称前缀--><constructor-arg value="business" name="namePrefix"/>
</bean>

(二)配置ThreadPoolTaskExecutor线程池

<!--Spring线程池-->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><!--核心线程数量--><property name="corePoolSize" value="20" /><!--最大线程数量--><property name="maxPoolSize" value="50" /><!--队列容量--><property name="queueCapacity" value="100" /><!--允许的空闲时间--><property name="keepAliveSeconds" value="60" /><!--线程超过空闲时间限制,会直接退出知道线程数量为0--><property name="allowCoreThreadTimeOut" value="true"/><!--配置自定义线程工厂--><property name="threadFactory" ref="businessThread"/>
</bean>

(三)ThreadPoolTaskExecutor线程池核心参数配置说明:

1、corePoolSize(核心线程数量):

配置核心线程数量需要考虑任务类型和任务负载等因素。
(1)CPU密集型任务:核心线程数量可设置为 CPU 核心数 + 1
(2)IO密集型任务:核心线程数量可设置为CPU 核心数 × 2,IO操作会导致线程阻塞,更多的线程可提高并发能力;
(3)如果任务负载较轻,可适当减小核心线程数量,如果任务负载较重,可适当增加核心线程数量;

2、maxPoolSize(最大线程数量):

配置最大线程数量需要考虑任务类型和任务负载等因素,最大线程数量应与队列容量匹配。
(1)CPU密集型任务:最大线程数量可设置为 CPU 核心数 + 1CPU 核心数 ×2之间;
(2)IO密集型任务:最大线程数量可设置为CPU核心数×2核心数×4之间;

3、queueCapacity(队列容量):

(1)CPU密集型任务:队列容量通常设置为100;
(2)IO密集型任务:队列容量通常设置为200到500;

4、keepAliveTime(空闲线程存活时间):

一个线程如果处于空闲状态,在指定时间内,这个线程会被销毁。

5、allowCoreThreadTimeOut(是否会回收核心线程):

如果核心线程空闲时间超过keepAliveTime,核心线程线程会被回收。

6、rejectedExecutionHandler(拒绝策略):

默认拒绝策略是ThreadPoolExecutor.AbortPolicy,任务数量超过最大线程数量,抛出RejectedExecutionException 异常。

(四)线程池使用

1、注入线程池
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
2、使用线程池创建线程
Runnable runnable = new Runnable() {@Overridepublic void run() {testService.threadTest(user);}
};
taskExecutor.execute(runnable);

参考
ThreadPoolExecutor拒绝策略
为何自定义线程工厂(ThreadFactory)

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

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

相关文章

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…

web day03 Maven基础 Junit

目录 Maven坐标&#xff1a; 依赖排除&#xff1a; 依赖范围&#xff1a; Maven生命周期&#xff1a; 单元测试&#xff1a; Junit入门&#xff1a; 断言&#xff1a; Junit中的常见注解&#xff1a; 概念&#xff1a;Maven 是一款用于管理和构建 Java项目的工具&#…

docker部署单机版doris

文章目录 前言一、系统环境简介二、部署要求三、部署安装1、基础设置2、下载镜像3、下载安装包4、启动镜像环境5、配置fe6、配置be 总结 前言 应项目测试需求&#xff0c;需使用docker部署单机版doris。 一、系统环境简介 #1 系统信息 [roottest][~] $cat /etc/redhat-relea…

【漏洞复现】CVE-2020-13925

漏洞信息 NVD - CVE-2020-13925 Similar to CVE-2020-1956, Kylin has one more restful API which concatenates the API inputs into OS commands and then executes them on the server; while the reported API misses necessary input validation, which causes the hac…

Linux:文件管理(一)——文件描述符fd

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…

mac上的建议xftp 工具

mac上的建议xftp 工具 最近使用mac比较频繁了&#xff0c;但是第一次重度使用mac里面有很多的工具都是新的&#xff0c;有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的&#xff0c;但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)

今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1&#xff1a; 给定如下图所示的timing report&#xff0c;请回答一下几个问题。 1&#xff09;这是一条setup还是hold的timing report?…

警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?

近年来&#xff0c;携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾&#xff0c;2018年延安某煤业瓦斯爆炸&#xff0c;均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广&#xff0c;相当一部分企业作业场所人员密集&#xff0c;…

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时&#xff0c;才会发生数据不一致。 主要流程就是要么先操作缓存&#xff0c;要么先操作Redis&#xff0c;操作也分修改和删除。 一般修改要执行一系列业务代码&#xff0c;所以一般直接删除成本较低…

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景&#xff1a; wordpress网站搬家&#xff0c;更换服务器IP后&#xff0c;如果没有域名时&#xff0c;使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下&#xff1a; 1.wordpress搬家后&#xff0c;在新服务器上&#xff0c;新建站点时&am…

探秘嵌入式位运算:基础与高级技巧

目录 一、位运算基础知识 1.1. 位运算符 1.1.1. 与运算&#xff08;&&#xff09; 1.1.2. 或运算&#xff08;|&#xff09; 1.1.3. 异或运算&#xff08;^&#xff09; 1.1.4. 取反运算&#xff08;~&#xff09; 1.1.5. 双重按位取反运算符&#xff08;~~&#xf…

MySQL底层概述—3.InnoDB线程模型

大纲 1.InnoDB的线程模型 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 5.Master Thread 1.InnoDB的线程模型 InnoDB存储引擎是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务。 后台线程的作用一&#xff1a;负责刷新内存…

pikachu平台xss漏洞详解

声明&#xff1a;文章只是起演示作用&#xff0c;所有涉及的网站和内容&#xff0c;仅供大家学习交流&#xff0c;如有任何违法行为&#xff0c;均和本人无关&#xff0c;切勿触碰法律底线 文章目录 概述&#xff1a;什么是xss一、反射型XSS1. get2. post 二、存储型XSS三、DOM…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

对于GC方面,在使用Elasticsearch时要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; 对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…

[仓颉Cangjie刷题模板] 优先队列(含小顶堆实现)

[TOC]([仓颉Cangjie刷题模板] 优先队列(含小顶堆实现) ) 一、 算法&数据结构 1. 描述 堆是一个可以维护实时最大/最小值的数据结构&#xff0c;相比treeset等常数优很多。 常用于维护一组数据的极值贪心问题。2. 复杂度分析 初始化O(n)查询O(1)修改O(lgn) 3. 常见应用…

解决 MySQL 5.7 安装中的常见问题及解决方案

目录 前言1. 安装MySQL 5.7时的常见错误分析1.1 错误原因及表现1.2 错误的根源 2. 解决方案2.1 修改YUM仓库配置2.2 重新尝试安装2.3 处理GPG密钥错误2.4 解决依赖包问题 3. 安装成功后的配置3.1 启动MySQL服务3.2 获取临时密码3.3 修改root密码 4. 结语 前言 在Linux服务器上…

计算机网络 网络安全基础——针对实习面试

目录 网络安全基础你了解被动攻击吗&#xff1f;你了解主动攻击吗&#xff1f;你了解病毒吗&#xff1f;说说基本的防护措施和安全策略&#xff1f; 网络安全基础 网络安全威胁是指任何可能对网络系统造成损害的行为或事件。这些威胁可以是被动的&#xff0c;也可以是主动的。…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…