首页 > 其他分享 >SpringBoot自定义线程池

SpringBoot自定义线程池

时间:2023-06-13 22:12:34浏览次数:50  
标签:SpringBoot 自定义 线程 executor new size ThreadPoolExecutor

SpringBoot自定义线程池

在 SpringBoot 中,可以使用 @Configuration 和 @Bean 去设置线程池,用 @Value 去做线程池的参数配置。

线程池配置:

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;



@Configuration
public class ThreadPoolExecutorConfig {

    /**
     * 核心线程数, :冒号后面是默认值
     */
    @Value("${executor.core.pool.size:20}")
    private int corePoolSize;

    /**
     * 最大线程数, :冒号后面是默认值
     */
    @Value("${executor.max.pool.size:100}")
    private int maxPoolSize;

    /**
     * 没有任务执行时,线程的存活时间
     */
    @Value("${executor.keep.alive.time:2}")
    private int keepAliveTime;

    /**
     * 阻塞队列长度
     */
    @Value("${executor.blocking.queue.size:200}")
    private int blockingQueueSize;


    /**
     * 使用 @Bean 指定线程池的名称
     *
     */
    @Bean("myExecutor")
    public Executor myExecutor() {

        //阻塞队列长度
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(blockingQueueSize);

        //创建线程或线程池时指定有意义的线程名称,方便出错时回溯。名称如果过长,会被截断。
        ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setNameFormat("my-executor-%d").build();
        //可以自定义拒绝策略,也可以不加这个参数,构造方法会直接用默认的拒绝策略
        ThreadPoolExecutor.AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy();

        return new ThreadPoolExecutor(corePoolSize, maxPoolSize,
                keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, abortPolicy);


    }


    /**
     * 不同的业务,有时可以使用不同的线程池、不同的配置。
     *
     */
    @Bean("myExecutor2")
    public Executor myExecutor2() {

        //阻塞队列长度
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(blockingQueueSize);

        //创建线程或线程池时指定有意义的线程名称,方便出错时回溯。
        ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setNameFormat("my-executor2-%d").build();
        //可以自定义拒绝策略,也可以不加这个参数,构造方法会直接用默认的拒绝策略
        ThreadPoolExecutor.AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy();

        return new ThreadPoolExecutor(corePoolSize, maxPoolSize,
                keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, abortPolicy);
    }

}

配置参数:

可以写到配置中心里面,如果没有配置中心,放到 propeties 文件也行。

executor.core.pool.size=20
executor.max.pool.size=100
executor.keep.alive.time=2
executor.blocking.queue.size=200

使用线程池:

日志框架自行补充,可以在Service类上面用 lombok的 @Slf4j 注解,也可以用其他的日志。

@Service
@Slf4j
public class MyService {

    @Resource(name = "myExecutor")
    private Executor executor;

    public void execute() {
        executor.execute(() -> log.info("线程池执行任务."));

    }

}

运行,查看日志:

INFO 18876 --- [ my-executor-0] com.example.demo.threadpool.MyService    : 线程池执行任务.

可以看到 线程池已经执行任务。日志中的 线程名称 是 my-executor 开头的。

把MyService 类中的 (name = "myExecutor") 换成 (name = "myExecutor2") ,再次运行,查看日志:

INFO 18876 --- [ my-executor2-0] com.example.demo.threadpool.MyService    : 线程池执行任务.

可以看到日志,线程池已经执行任务。 线程名称 变成 了 my-executor2 开头的了。

创建线程或线程池时,指定有意义的线程名称,方便出错时回溯。

Spring / 普通Java项目的自定义线程池

详情见:https://www.cnblogs.com/expiator/p/17140760.html

标签:SpringBoot,自定义,线程,executor,new,size,ThreadPoolExecutor
From: https://www.cnblogs.com/expiator/p/17478821.html

相关文章

  • jmeter线程组/随机顺序控制器/随机控制器/循环控制器/仅一次控制器的使用
    一.jmeter线程组的使用  根据http://api.qingyunke.com/api.php?key=free&appid=0&msg=%E9%B9%85%E9%B9%85%E9%B9%85拆分如图察看结果树:取样器结果:是返回有无调通  请求:发送的请求数据信息 响应数据:显示接口返回的数据  二。随机顺序控制器的使用使用随机顺序控制......
  • 【vue】前端下载文件自定义文件名称
    【vue】前端下载文件自定义文件名称https://blog.csdn.net/weixin_48200589/article/details/125067618下载文件自定义文件名称文件下载名称不想和后端提供的URL一样怎么办呢?1.首先给按钮去绑定一个事件2.正常我们的下载处理方式3.自定义下载的文件名字文件下载名称......
  • AntDesign自定义校验表单
    <a-rowclass="row":gutter="32"><a-col:span="16"><a-form-itemlabel="场景模板标签"name="tags"><a-......
  • springboot+JXLS+Jexl实现报表模版生成报表
    前言做这个项目的思路是由于公司基于自身发展,需要将之前的老项目平台拆解出来,由于之前的项目是所有的功能全部集中在一起,学习成本以及后续的扩展性来说,非常的不友好,并且由于之前设计人员的流失导致了项目无法进一步优化,所以想将其进行拆解,将单个功能模块进行拆分,形成微服务化,使每......
  • 如何自定义drf的ValidationError()中的传的内容
     鼠标点击ValidationError(),再点击PyCharm右侧对应两个按钮,找见源码如下 结论:你可以直接传dict或list内容......
  • springboot~代码风格统计spring-javaformat-maven-plugin插件
    SpringJavaformat是Spring团队开发的一款基于GoogleJavaFormat的代码格式化工具,可以帮助Java开发者自动化进行代码格式化,提高代码质量,降低代码维护成本。SpringJavaformat可以自定义配置文件,支持大量的代码风格配置选项,满足不同项目和团队的需求。还可以与Gradle、Maven、Int......
  • 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
    本文目录1、概述2、自定义菜单的规则3、自定义菜单接口可实现按钮类型的种类4、创建菜单4.1、创建菜单的接口4.2、使用Senparc.Weixin.MPSDK创建自定义菜单4.3、查询已创建的菜单4.4、删除已创建的菜单5、菜单响应事件的处理5.1、点击菜单拉取消息时的事件推送5.2、击菜单跳转链......
  • C#如何进行多线程编程
    C#如何进行多线程编程由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。窗体代码:namespaceThreadExample{......
  • springboot rabbitmq配置
    YMLrabbitmq:host:xxx.xxx.xxx.xxxport:5672virtual-host:devusername:xxxpassword:xxxpublisher-confirm-type:correlatedpublisher-returns:truelistener:direct:acknowledge-mode:autosimple:......
  • 线程池核心线程为0依然执行
    privatefinalThreadPoolExecutorexecutorService=newThreadPoolExecutor(0,20,60,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<>(1000),newThreadPoolExecutor.CallerRunsPolicy());@GetMapping("/hello")public......