项目中使用过的线程池ThreadPoolTaskExecutor

news2024/11/15 0:00:14

创建线程池的实例应用

package com.youming.shuiku.datacenter.provider.utils;


import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Slf4j
public class AsyncManager {
    //线程处理类
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
    //本类
    private static AsyncManager asyncManager;
    //该无参构造方法用于或得在容器中得线程处理类
    private AsyncManager(){
        //获得在容器中的线程处理类
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(12);//核心线程大小
        threadPoolTaskExecutor.setMaxPoolSize(48 * 2);//最大线程大小
        threadPoolTaskExecutor.setQueueCapacity(500);//队列最大容量
        threadPoolTaskExecutor.setKeepAliveSeconds(300);
        //当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
        threadPoolTaskExecutor.setThreadNamePrefix("TaskLogo-Thread-");
        threadPoolTaskExecutor.initialize();
        //查看线程的数量
        if(threadPoolTaskExecutor.getCorePoolSize()!=12){
            log.info("getMaxPoolSize==="+threadPoolTaskExecutor.getCorePoolSize());
        }
    }
    //该方法用于创建AsyncManager类 就是本类
    public static AsyncManager getInstance(){
        //判断本类是不是空 如果是空的话就创建一个 返回 如果不是空就直接放回
        if (asyncManager == null){
            synchronized (AsyncManager.class){
                if(asyncManager == null){
                    asyncManager = new AsyncManager();
                    return asyncManager;
                }
            }
        }
        return asyncManager;
    }
    //该方法用于把任务提交
    public void execute(Runnable runnable){
        //execute线程的无返回值提交方法
        threadPoolTaskExecutor.execute(runnable);
    }
}

使用:

AsyncManager.getInstance().execute(asyncFactory.getDingTalkToken());


public Runnable getDingTalkToken() {
		Runnable runnable = () -> {
			List<DingTalkConfig> list = dingTalkConfigService.list();
			for (DingTalkConfig dingTalkConfig : list) {
				String token = acquireDingTalkToken(dingTalkConfig.getCorpId(), dingTalkConfig.getAppSecret());
				redisTemplate.opsForValue().set(dingTalkConfig.getRedisKey(), token, 2, TimeUnit.HOURS);
			}
		};
		return runnable;
	}

使用@Async注解实现多线程

@EnableAsync 是用于在Spring框架中启用异步方法执行的注解。它允许你在方法上使用 @Async 注解,从而实现方法的异步执行。异步方法执行意味着当你调用这些方法时,它们会在一个独立的线程中执行,而不会阻塞主调用线程。

默认情况下,Spring中的方法是同步执行的,即方法调用会等待方法的执行完成后再继续。但有时候,某些方法可能需要执行一些耗时的操作,如果在主线程中执行,可能会导致响应时间过长或影响系统的吞吐量。这时,你可以使用 @Async 注解并结合 @EnableAsync 启用异步执行,从而将这些耗时操作放在独立的线程中执行,提高系统的性能和响应性。

需要注意的是,为了使 @EnableAsync 注解生效,还需要配置一个 Executor(执行器),它负责管理异步方法的线程池。如果没有自定义配置,Spring会使用默认的线程池来执行异步方法。你可以通过在配置类上实现 AsyncConfigurer 接口或使用 @EnableAsync 的 executor 属性来自定义线程池的行为。

使用:

package com.youming.shuiku.datacenter.provider.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @ fileName:ThreadPoolConfig
 * @ description:
 * @ author:wxh
 * @ createTime:2022/8/13 15:51
 * @
 * version:1.0.0
 */
@Configuration
@EnableAsync
@Slf4j
public class ThreadPoolConfig {

	@Bean("asyncServiceExecutor")
	public ThreadPoolTaskExecutor asyncServiceExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		// 核心线程数
		executor.setCorePoolSize(4);
		// 最大线程数
		executor.setMaxPoolSize(8);
		// 线程池的队列大小
		executor.setQueueCapacity(1000);
		// 线程名称前缀
		executor.setThreadNamePrefix("async-service-");
		// 当线程池饱和拒绝策略
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 初始化
		executor.initialize();
		return executor;
	}

}

使用的时候在方法加上对应的bean名称

在这里插入图片描述
注意:需要配置类加上@EnableAsync注解才会开启多线程的执行。

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

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

相关文章

UnixBench 5.1.3 银河麒麟桌面操作系统V10 (SP1) ARM64 aarch64 图形性能测试 2d 3d, glmark2 3d测试

编译 安装libgl sudo apt install libgl-dev yeqiangyeqiang-greatwall:~/Downloads/UnixBench$ sudo apt install libgl-dev [sudo] yeqiang 的密码&#xff1a; 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包…

安卓耗电量分析

这里写自定义目录标题 耗电原因分析分析类型 生成分析数据batterystats操作步骤:生成report报告 battery-historian手动编译安装容器安装内容解析 耗电原因分析 下文有阐述&#xff0c;很详细 https://www.cnblogs.com/SA226343/p/6047543.html https://www.cnblogs.com/mytec…

美颜SDK开发指南:优化直播人像表现

在当今社交媒体和直播平台的流行趋势下&#xff0c;越来越多的用户渴望在直播中展现更加自信和美丽的一面。本文将探讨美颜SDK的开发指南&#xff0c;介绍其优化直播人像表现的重要性以及关键的技术要点。 一、用户为什么离不开美颜&#xff1f; 美颜SDK作为一种集成在直播应用…

javascript运算符与流程控制

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 javascript 也可获取。 文章目录 运算符的分类算数运算符浮点数的精度问题 递增和递减运算符比较运算符逻辑运算符短路运算&#xff08;逻辑中断…

报表工具有哪些?奥威BI+方案,快速搞定数据分析

报表工具有很多&#xff0c;如Excel、 Tableau、Power BI、帆软BI、思迈特BI等都是中国企业常用的报表工具&#xff0c;但要说能够成熟使用“BI方案”&#xff0c;更快地完成部署&#xff0c;推动企业大数据分析的却寥寥无几。“奥威BI方案”&#xff0c;低风险、高效率、高性价…

首期华为云ROMA Connect《企业集成战略与华为数字化之道》高研班在东莞圆满举办

7月25日&#xff0c;首期华为云ROMA Connect《企业集成战略与华为数字化之道》高研班在东莞华为制造业数字化转型中心圆满举办。 20多家东莞精密机械、电子、环保等领域的先进企业董事长、总经理、CIO、总监等高管参加培训。 本次高研班邀请到华为数字化转型专家陈劲、马兵东…

paddle实现获取pdf的内容

paddle实现获取pdf的内容 1. 环境安装2. 实现代码 源码链接 1. 环境安装 安装paddlepaddle gpu版本python -m pip install paddlepaddle-gpu -i https://pypi.tuna.tsinghua.edu.cn/simplecpu版本&#xff1a;python -m pip install paddlepaddle -i https://pypi.tuna.tsing…

NeRF知识点:不同Contraction的数学表达

NeRF知识点&#xff1a;不同Contraction的数学表达 目录 Foward-facing 场景&#xff1a;NDC&#xff08;Normalized Device Coordinate&#xff09;1 360&#xff0c;object-centric 场景&#xff1a; inverse-sphere warping1 MeRF: Piecewise-projective Contraction1 …

基于以太坊+IPFS的去中心化数据交易方法及平台

自己的论文&#xff0c;哎费事 目录 基于以太坊IPFS的去中心化数据交易方法及平台 基于以太坊IPFS的去中心化数据交易方法及平台 摘要&#xff1a; 数据交易过程中存在数据权属不明和数据安全问题。本文开发了一种基于以太坊IPFS的去中心化数据交易方法及平台。方法包括&am…

函数指针数组

前面学习过数组 指针数组&#xff1a;用来存放数组指针&#xff08;地址&#xff09;的数组 int main() {int arr1[] { 0 };int arr2[] { 0 };int arr3[] { 0 };int* p[3] { arr1,arr2,arr3 };//指针数组return 0; }那么函数指针数组&#xff0c;就是用来存放几个类型相同…

application.yml 或 application.properties 配置文件乱码问题

一、idea写application.yml配置文件&#xff0c; 用到了中文注释&#xff0c;写的时候好好地&#xff0c;但是运行项目后&#xff0c;出现乱码情况&#xff0c;如下&#xff1a; 二、解决方法 将文件编码方式 设置成UTF-8即可 File-Setting-Editor-File Encodings 再次运行项…

「2024」预备研究生mem-一元二次不等式恒成立高次、分次不等式(包含穿根法)

一、一元二次不等式恒成立 二、高次不等式&#xff08;包含穿根法&#xff09; 三、分次不等式 四、课后习题

蓝牙资讯|谷歌推迟上线Find My Device,需等到苹果同步跟进

谷歌今年 5 月初宣布推出“寻找我的设备”&#xff08;Find My Device Network&#xff09;&#xff0c;目标是为全球超过 10 亿台安卓设备服务&#xff0c;帮助用户寻找丢失的设备。 谷歌在今年 5 月宣布&#xff0c;Find My Device 网络将兼容 Tile、Pebblebee 和 Chipolo …

aws中opensearch 日志通(Centralized Logging with OpenSearch)2.0(一)

aws日志通2.0 实现全面的日志管理和分析功能 一体化日志摄取 &#xff1a;把aws服务器日志和应用日志传输到opensearch域中无代码日志处理 &#xff1a;在网页控制台中就可以实现数据处理开箱即用 &#xff1a;提供可视化模版&#xff08;nginx、HTTP server &#xff09; 架构…

方法的定义和格式

方法 什么是方法&#xff1f; 方法是程序中最小的执行单元 定义&#xff1a;把一些代码打包在一起&#xff0c;该过程称为方法 实际开发过程中&#xff0c;什么时候用到方法&#xff1a; 重复的代码&#xff0c;具有独立功能的代码可以抽取到方法中 实际开发中&#xff0c;方…

【容器编排】初识 Kubernetes

目录 1.简介 2.为什么需要 k8s 3.k8s 能做什么? 4.k8s 不是什么? 1.简介 摘取官网: 概述 | Kubernetes Kubernetes 这个名字源于希腊语&#xff0c;意为舵手或飞行员。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kub…

Vue3自定义封装音频播放器

&#x1f680; 本片主要讲解如何使用Vue3去封装一个音频播放器&#xff0c;以及解决在ios微信浏览器中 无法获取音频时长问题 一、效果图 二、解决在微信环境中ios无法获取音频时长问题 1、安装weixin-js-sdk cnpm i weixin-js-sdk --save2、使用&#xff0c;通过wx.ready中重…

【CAS6.6源码解析】深入解析TGT和ST的唯一ID是怎样生成的-探究ID生成器的设计

CAS作为一款企业级中央认证服务系统&#xff0c;其票据的生成是非常重要的一环&#xff0c;在票据的生成中&#xff0c;有一个比较重要的点就是为票据生成唯一ID&#xff0c;本文将深入解析CAS系统中的TGT和ST的唯一ID是怎样生成的。 文章重点分析源码的过程&#xff0c;不想看…

W2NER详解

论文&#xff1a;https://arxiv.org/pdf/2112.10070.pdf 代码&#xff1a;https://github.com/ljynlp/W2NER 文章目录 W2NER介绍模型架构解码 源码介绍数据输入格式模型代码 参考资料 W2NER 介绍 W2NER模型&#xff0c;将NER任务转化预测word-word&#xff08;备注&#xff…

基于flask旅游大数据可视化分析推荐系统-计算机毕设 附源码10903

flask旅游大数据可视化分析推荐系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对旅游大…