java线程池实战应用总结
一、线程池的创建方式
方式(一):通过构造函数ThreadPoolExecutor()方式创建线程池
步骤1:先构建线程池
public class AsyncTaskExecutor {/*** 核心线程数*/private static final int corePoolSize = 10;/*** 最大线程数*/private static final int maxPoolSize = 30;/*** 空闲线程回收时间* 空闲线程是指:当前线程池中超过了核心线程数之后,多余的空闲线程的数量*/private static final int keepAliveTime = 100;/*** 任务队列/阻塞队列*/private static final int blockingQueueSize = 99999;private static final ThreadPoolExecutor executorPool = new ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(blockingQueueSize),new ThreadFactoryBuilder().setNameFormat("AsyncTaskThread" + "-%d").build(),new ThreadPoolExecutor.CallerRunsPolicy());/*** 异步任务执行** @param task*/public static void execute(Runnable task) {executorPool.execute(task);}
}
步骤2:通过实现Runnable接口,创建异步任务
@Slf4j
public class CommonTask implements Runnable {/*** 模块ID*/private Long modelId;/*** 模块名称*/private ModelEnum modelName;/*** 构造方法** @param modelId* @param modelName*/public CommonTask(Long modelId, ModelEnum modelName) {this.modelId = modelId;this.modelName = modelName;}@Overridepublic void run() {log.info("start to process common task!!!");if (modelId.intValue() == ModelEnum.Chinese.getCode()) {String name = ModelEnum.Chinese.getValue();log.info("modelID = {} modelName = {}", modelId, name);} else {modelName = ModelEnum.forValue(modelId.intValue());log.info("modelID = {} modelName = {}", modelId, modelName.getValue());}}
}
枚举
public enum ModelEnum {Chinese(1, "语文"),Math(2, "数学"),English(3, "数学");/*** code*/private int code;/*** value*/private String value;/*** 映射结果集*/private static final Map<Integer, ModelEnum> VALUE_MAP;static {VALUE_MAP = new HashMap<>();for (ModelEnum modelEnum : ModelEnum.values()) {VALUE_MAP.put(modelEnum.code, modelEnum);}}ModelEnum(int code, String value) {this.code = code;this.value = value;}public int getCode() {return code;}public String getValue() {return value;}/*** 根据code获取枚举实例** @param code* @return*/public static ModelEnum forValue(int code) {return VALUE_MAP.get(code);}}
步骤3:验证
//步骤1:创建异步任务CommonTask task = new CommonTask(1L, ModelEnum.Chinese);//步骤2:调用线程池异步执行任务AsyncTaskExecutor.execute(task);log.info("main thread over...");
结果如下:
2024-05-23 14:53:16.096 INFO 20652 --- [ main] com.example.demo.dao.UserDaoTest : main thread over...
2024-05-23 14:53:16.097 INFO 20652 --- [yncTaskThread-0] com.example.demo.task.CommonTask : start to process common task!!!
2024-05-23 14:53:16.097 INFO 20652 --- [yncTaskThread-0] com.example.demo.task.CommonTask : modelID = 1 modelName = 语文
方式(二):构建ThreadPoolTaskExecutor线程池,将其声明为Bean,可以通过注入bean的方式和在方法上使用@Async(“asyncTaskExecutor”)这种注解方式使用此线程池
@Slf4j
@Configuration
@EnableAsync
public class TaskExecutor {@Value("${async.executor.thread.core_pool_size}")private int corePoolSize;@Value("${async.executor.thread.max_pool_size}")private int maxPoolSize;@Value("${async.executor.thread.queue_capacity}")private int queueCapacity;@Value("${async.executor.thread.name.deal_task}")private String taskNamePrefix;/*** 构建线程池 并将其声明为Bean* 方式1:可以通过注入的方式使用此线程池* 方式2:可以在方法上使用@Async("asyncTaskExecutor")这种注解方式使用此线程池** @return*/@Bean(name = "asyncTaskExecutor")public Executor asyncTaskExecutor() {log.info("start asyncTaskExecutor...");ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();threadPoolTaskExecutor.setCorePoolSize(corePoolSize);threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);threadPoolTaskExecutor.setQueueCapacity(queueCapacity);threadPoolTaskExecutor.setThreadNamePrefix(taskNamePrefix);//拒绝策略:当前线程数已经达到最大线程数后,如何处理新任务//CallerRunsPolicy()不在新线程中执行任务,而是返回调用者所在的线程来执行threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());threadPoolTaskExecutor.initialize();return threadPoolTaskExecutor;}
}
在application.yml中的配置
async:executor:thread:core_pool_size: 10max_pool_size: 10queue_capacity: 99999name:deal_task: DEAL-TASK-
使用方式1:在方法上使用@Async(“asyncTaskExecutor”)这种注解方式使用此线程池
使用方式2:通过注入的方式使用此线程池
@Slf4j
@Service
public class WorkServiceImpl implements WorkService {@Async("asyncTaskExecutor")public void doAsyncTask() throws InterruptedException {Thread.sleep(1000);log.info("do AsyncTask...");}
}
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {SqlSession sqlSession;@Resourceprivate WorkService workService;@Resourceprivate Executor asyncTaskExecutor;@Testpublic void test() {try {//方式1:在方法上使用@Async("asyncTaskExecutor")这种注解方式使用此线程池for (int i = 0; i < 5; i++) {workService.doAsyncTask();}log.info("main Thread over...");//方式2:通过注入的方式使用此线程池(方便)asyncTaskExecutor.execute(() -> {log.info("async task is running..");});Thread.sleep(5000);}catch (Exception e) {e.printStackTrace();}}
}
相关文章:
java线程池实战应用总结
一、线程池的创建方式 方式(一):通过构造函数ThreadPoolExecutor()方式创建线程池 步骤1:先构建线程池 public class AsyncTaskExecutor {/*** 核心线程数*/private static final int corePoolSize 10;/*** 最大线程数*/priva…...
部署 harbor 创建私有项目
一在 Docker harbor 节点(192.168.11.)上操作 1 关闭防火墙防护 systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 2 安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-ma…...
在Linux系统中解决Java生成海报文字乱码和缺少字体文件的问题
在Linux系统中,如果缺少特定的字体文件,可以通过以下几种方法来解决: 1. 安装系统字体包 大多数Linux发行版提供了各种字体包,可以通过包管理器安装这些字体包。例如,在Debian/Ubuntu系统上,可以使用以下命令安装常见的字体包: # 安装基本的字体包 sudo apt-get updat…...
升级版网创教程wordpress插件自动采集并发布
主要功能: wordpress 插件主题系列支持自动采集并发布。 主要采集: 福缘,中创,冒泡 自动采集各大项目网进行整合发布到自己个人网站 插件话更新,减少网络请求,提升稳定性 代码完美开源 傻瓜式操作,一…...
MySQL 视图(1)
常用视图语句 -- 创建视图 CREATE VIEW t1_view AS SELECT * FROM t1; CREATE VIEW v AS VALUES ROW(1,2);-- 查询视图 SELECT * FROM t1_view;-- 查询视图的相关系统视图 SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = test AND TABLE_NAME =…...
在排序数组中查找元素的一个位置和最后一个位置-力扣
第一此次想到的解法是首先使用二分查找在排序数组中查找到一个指定元素,随后对该元素左右进行遍历,找到起始位置和结束位置,代码如下: class Solution { public:vector<int> searchRange(vector<int>& nums, int…...
系统分析师-案例分析-数据库
系统分析师-案例分析-数据库 更多软考资料 https://ruankao.blog.csdn.net/ 文章目录 系统分析师-案例分析-数据库数据库考察知识点规范化函数依赖范式1NF2NF3NF 规范化问题不规范化反规范化设计反规范化设计同步问题 并发控制性能优化完整性约束视图安全分布式数据库特点优点…...
【RabbitMQ】使用SpringAMQP的消息队列(Hello Word)和工作队列(Work Queue)
SpringAMQP SpringAMQP中文文档 Hello Word **案例1:**利用SpringAMQP实现HelloWord中的集成消息队列功能 项目结构,如图: 1.引入AMQP依赖(父工程中) <!--AMQP依赖,包含RabbitMQ--> <dependen…...
项目集成SkyWalking,基于k8s搭建
一、搭建SkyWalking 官方文档(英文):skywalking/docs at master apache/skywalking 中文可以使用:GitHub - SkyAPM/document-cn-translation-of-skywalking: [已过期,请使用官网AI文档] The CN translation version of Apache…...
mysql-差异备份流程
4.差异备份流程 差异备份流程(重要) 第一次完整备份 innobackupex /xtrabackup innobackupex --userroot --password123456 /xtrabackup2024-05-23_20-25-05 第一次完整备份 2024-05-23_20-40-55 第二次差异备份 2024-05-23_20-47-37 第三次差异备份再往数据库里面…...
基于动态规划算法的DNA序列比对函数,给出两条序列(v和w)的打分矩阵
一.什么是动态规划算法 1.1总体思想 动态规划算法与分治法类似,基本思想也是将待求解的问题分成若干个子问题 经过分解得到的子问题往往不是互相独立的,有些子问题被重复计算多次 如果能够保存已解决的子问题答案,在需要时再找出来已求得…...
Tailwind CSS快速入门
文章目录 初识安装Tailwindcss试用安装快速书写技巧扩展好处Todo 初识 只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站 Tailwind CSS 是一个功能类优先的 CSS 框架,它通过提供大量的原子类(utility classes)…...
Postman使用技巧
Postman是一款广泛使用的API开发和测试工具,专为简化Web服务API的开发、测试、文档编制和协作过程而设计。它支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等,允许用户轻松地构建和发送请求,以及检查响应。 本文介绍几个提升效…...
sqli-labs靶场
less---11 1.求闭合字符 输入1报错说明存在注入点 存在注入点 2.查库名 使用报错注入查库名 admin” and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)y)# //floor函数报错 3.查表名 admin and upd…...
基于springboot的大创管理系统
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。文章介绍了大创管理系统的系统分析部分&…...
常用torch.nn
目录 一、torch.nn和torch.nn.functional二、nn.Linear三、nn.Embedding四、nn.Identity五、Pytorch非线性激活函数六、nn.Conv2d七、nn.Sequential八、nn.ModuleList九、torch.outer torch.cat 一、torch.nn和torch.nn.functional Pytorch中torch.nn和torch.nn.functional的区…...
力扣226.翻转二叉树101.对称二叉树
解决二叉树的问题,经常要习惯从递归角度思考 左子树/右子树是否具备某属性、是否属于什么类型(和题目要求的判断当前树是否xxx一样); 对左/右子树进行什么操作(和题目要求的对当前树的操作一样)。 226.翻转…...
word如何按照原本页面审阅文档
1 视图-阅读视图 2 视图,自己看,懒得打字了哈哈...
前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代
前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代 WebAssembly基础概念工作原理概览WebAssembly实战示例基本使用 安全性与性能优化防范漏洞实践实际工作中的使用技巧结语与讨论 随着Web技术的飞速发展,前端开发者面临越来越…...
NDIS小端口驱动(四)
NDIS中断相关 1. 注册和取消注册中断: 微型端口驱动程序调用 NdisMRegisterInterruptEx 来注册中断。 驱动程序分配并初始化 NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS 结构,以指定中断特征和函数入口点,驱动程序将结构传递给 NdisMRegister…...
ESP32蓝牙音频终极指南:3个实用技巧轻松实现A2DP音乐传输 [特殊字符]
ESP32蓝牙音频终极指南:3个实用技巧轻松实现A2DP音乐传输 🎵 【免费下载链接】ESP32-A2DP A Simple ESP32 Bluetooth A2DP Library (to implement a Music Receiver or Sender) that supports Arduino, PlatformIO and Espressif IDF 项目地址: https:…...
通过Taotoken CLI工具一键配置多开发环境接入参数
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken CLI工具一键配置多开发环境接入参数 在接入大模型服务时,开发者常常需要为不同的开发工具(如…...
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗࿱…...
3步解锁你的专属B站:Bilibili-Evolved开源增强工具完全指南
3步解锁你的专属B站:Bilibili-Evolved开源增强工具完全指南 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved 你是否曾对B站千篇一律的界面感到审美疲劳?是否被首页推荐…...
3步解决微信红包难题:智能助手帮你告别手慢烦恼
3步解决微信红包难题:智能助手帮你告别手慢烦恼 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: https:/…...
作业5:案例挑战
文章目录1、密码锁设计 P110,2、基于PWM的可调光台灯设计 P131,3、动态密码获取系统设计 P210,效果(1) 密码模式说明(2) 测试密码输入(3) 测试修改密码(4) 测试修改密码模式4、数码管时钟系统设计 P228,7.5.2 数码管时钟系统设计&…...
轻松掌握华硕笔记本性能控制:轻量级替代工具的使用方法
轻松掌握华硕笔记本性能控制:轻量级替代工具的使用方法 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…...
(QBuffer配合 QDataStream)二进制序列化
QByteArray arr; QBuffer buf(&arr); buf.open(QIODevice::WriteOnly); QDataStream out(&buf); out << QString(“hello”) << 123; // 序列化 // 反序列化 buf.seek(0); QDataStream in(&buf); QString s; int n; in >> s >> n;...
企业微信外部群如何通过 API 自动化投递结构化小程序卡片
能力介绍 相比于传统的文字链接,结构化的小程序卡片拥有更高的点击率和更规范的视觉展现。该能力允许开发者通过主动调用 API,直接向指定的企业微信外部群投递原生小程序卡片。接口支持自定义动态配置小程序的 appid、首屏页面路径 pagepath(…...
机器学习之逻辑回归算法
一、逻辑回归简介 1. 定义 逻辑回归(Logistic Regression)是一种有监督学习算法,主要用于解决二分类问题的统计学习方法。尽管名字中带有“回归”,但它实际上是一种分类算法。 大白话解释 逻辑回归就是一种“做判断题”的算法&…...
