ThreadPoolTaskExecutor线程池参数配置_threadpooltaskexecutor 配置-程序员宅基地

技术标签: 并发编程JUC  线程池参数配置  JUC  Executors  线程池配置  线程池  

一、线程池配置

1、ThreadPoolConfig

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.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ThreadPoolConfig {
    

    private final static int AVAILABLE_PROCESSOR = Runtime.getRuntime().availableProcessors();

    /**
     * 通用线程池配置
     */
    @Bean("taskPoolExecutor")
    public Executor taskExecutor() {
    
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //设置线程池参数信息
        taskExecutor.setCorePoolSize(6);
        taskExecutor.setMaxPoolSize(6*2);
        taskExecutor.setQueueCapacity(12);
        taskExecutor.setKeepAliveSeconds(60);
        taskExecutor.setThreadNamePrefix("taskPoolExecutor--");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        //修改拒绝策略为使用当前线程执行
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        //初始化线程池
        taskExecutor.initialize();
        return taskExecutor;
    }

     /**
     * 发送短信线程池
     * @return
     */
    @Bean("sendSmsThreadPool")
    public Executor sendSmsThreadPool() {
    
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //设置线程池参数信息
        taskExecutor.setCorePoolSize(AVAILABLE_PROCESSOR);
        taskExecutor.setMaxPoolSize(AVAILABLE_PROCESSOR + 1);
        taskExecutor.setQueueCapacity(256);
        taskExecutor.setKeepAliveSeconds(20);
        taskExecutor.setThreadNamePrefix("sendSmsThreadPool--");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        //修改拒绝策略为使用当前线程执行
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //初始化线程池
        taskExecutor.initialize();
        return taskExecutor;
    }

    /**
     * 发送邮件线程池
     * @return
     */
    @Bean("sendEmailThreadPool")
    public Executor sendEmailThreadPool() {
    
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //设置线程池参数信息
        taskExecutor.setCorePoolSize(AVAILABLE_PROCESSOR);
        taskExecutor.setMaxPoolSize(AVAILABLE_PROCESSOR + 1);
        taskExecutor.setQueueCapacity(256);
        taskExecutor.setKeepAliveSeconds(20);
        taskExecutor.setThreadNamePrefix("sendEmailThreadPool--");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        //修改拒绝策略为使用当前线程执行
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //初始化线程池
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(5);
        executor.setQueueCapacity(10);
        executor.setKeepAliveSeconds(300);
        executor.setThreadNamePrefix("thread-ayokredit"); //线程名称
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

    
}

2、使用@Async注解的问题

如果想要要结合Spring提供的异步注解@Async使用,需要在@Async注解中指定我们自定义的线程池的Bean。不指定我们自定义线程池的Bean的话将会默认使用Spring提供的线程池,默认情况下,每次都会创建一个新线程,如果在高并发的场景下,可能会产生大量的线程,从而导致OOM问题。
所以建议大家在@Async注解开启的异步功能时,请别忘了定义一个线程池,同时指明要生效的线程池的Bean。
如:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Thinkingcao/article/details/123641255

智能推荐

敏捷开发步骤简述_商业价值和工作量 优先级-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏25次。1.用户需求分析转化为产品BACKLOG这个部分的内容由PM具体负责,主要的工作内容如下:用户调研、需求分析,确定产品迭代功能,出具产品BACKLOG。决定产品的发布日期与发布内容,给迭代计划预设目标。根据RIO(商业价值/工作量)排序优先级,考虑必要风险。 优先级排序:排序的目的,是弄清楚哪些需求最重要因此可能在最近的一两次迭代中进行开发。参与排序的条目一般足够接近半年的开发工作..._商业价值和工作量 优先级

2021 开发何不换种姿势 LLVM+clang+Meson+ninja_ninja 和clang-程序员宅基地

文章浏览阅读1.7k次。目前常见的C/C++开发多数使用的是gnu+makefile的开发方式,每次开发的时候编译的配置文件写的头疼.而使用cmake虽然可以自动辅助生成makefile文件,并且可移植性也变得更好的,不过也常常逃不掉要经常手动修改的时候自己的cmake文件的命运,那有没有更高效的方法呢?叮叮~LLVM+clang+Menson+ninja 豪华大礼包值得了解一下**LLVM和Clang 原意为 low level virtual machine,不过实际上现在的LLVM从来没有用过虚拟机,用于编译器的链_ninja 和clang

C语言实现的PLC软定时器 上升沿,下降沿判断算法及功能_c语言上升沿和下降沿程序-程序员宅基地

文章浏览阅读7.2k次,点赞18次,收藏21次。一、序言 使用单片机开发开发过程控制中,经常会用到定时,变量上升沿动作,下降沿动作,在业余做了个单独工具处理模块二、C代码组成如下共有.h文件和.c文件组成。2.1 F00200_utils.h代码构成#ifndef __F00200_UTILS_H__#define __F00200_UTILS_H__#include "stm32f10x.h"#define P..._c语言上升沿和下降沿程序

七种常见的逻辑门真值表_各大逻辑门真值表-程序员宅基地

文章浏览阅读6.2w次,点赞47次,收藏289次。(verilog学习笔记一之常见的逻辑门真值表)1、 与门:所有输入为高时,才会有输出高。逻辑函数表示为F=A*B。输入A输入B输出Y0000101001112、 或门:所有输入为低时,才会有输出低。逻辑函数表示为F= A + B。输入A输入B输出Y0000111011..._各大逻辑门真值表

FreeSWITCH实现AMR/AMR-WB编解码_amrwbenc-程序员宅基地

文章浏览阅读1.9k次。1、写在前面FreeSWITCH对AMR和AMR-WB两种编码格式默认为passthough状态,若想对AMR和AMR-WB进行编解码,需对mod_amr和mod_amrwb两个模块重新编译。本文介绍通过源码编译所需的opencore-amr和ov-amrwbenc两个依赖库。当然也可使用yum等工具直接安装libopencore-amrnb.so、libopencore-armwb.so、libvo-amrwbenc.so.本文内涉及的所有路径,均可根据实际情况进行更改,不局限于root用户。2、_amrwbenc

c++语言实现字符分割,C++常用字符串分割方法实例汇总-程序员宅基地

文章浏览阅读824次。本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下:我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。一、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始..._c/c++按指定字符分割

随便推点

学生如何提高专业英文阅读能力 精选-程序员宅基地

文章浏览阅读428次。【 序:此文针对本科生和一、二年级的博士、硕士生,对高年级的博士生和博士后也应该有参考价值。该文的一些背景可以参考我此前关于提高英文写作能力的博文:http://www.sciencenet.cn/m/user_content.aspx?id=349932】 从小到大,我感性思维多一些,不善于读书。85至89年在清华生物系读本科期间,从未读过任何一种英文专业期刊。我受到的与英文阅读_学生如何提高专业英文阅读能力

威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿***新“跳板”-程序员宅基地

文章浏览阅读160次。简介阿里云安全于近日捕获到一起使用Jenkins RCE漏洞进行***的挖矿事件。除挖矿外,***者还曾植入具有C&C功能的tsunami***,也预留了反弹shell的功能,给用户带来极大安全隐患。由于***者直接复制了Jenkins系列漏洞发现者(Orange.tw)在博客上公布的poc,***payload含有"Orange.tw"字样,可能被误认为是漏洞发现者在进行测试,因此我们..._cve-2019-1003000 jenkins rce 复现

如何使用计算机勾绘汇水面积,汇水面积怎么计算-程序员宅基地

文章浏览阅读853次。雨水汇水面积应按地面、屋面水平投影面积计算。高出屋面的侧墙,应附加其最大受雨面正投影的一半作为有效汇水面积计算。也就是54.6*27计算就好,如果考虑最大受雨面积的话需要给出楼梯间突出屋面的高度。假设高度为3米,计算在计算一个最大受雨面3*(9+4.5)/2就好。也就是,1474.2+20.25=1494.45平方米。汇水面积指的是雨水流向同一山谷地面的受雨面积。跨越河流、山谷修筑道路时,必须建桥..._水库汇水区怎么画

面试知识积累,人工智能技术应用笔记(六,Python工程面试问题-程序员宅基地

文章浏览阅读649次,点赞11次,收藏5次。本篇为《人工智能技术应用》专栏的第六篇。希望以学习笔记的形式和大家一起了解和探索人工智能技术的实际应用。

在哪看oracle归档日志,oracle查看归档日志路径-程序员宅基地

文章浏览阅读2.6k次。oracle查看归档日志路径第一种办法是去默认目录$ORACLE_BASE/flash_recovery_area查看,在oracle10g、oracle11g系列的版本里面[oracle@pldb236 ~]$ ll $ORACLE_BASE/flash_recovery_areatotal 8drwxr-x---. 6 oracle oinstall 4096 Mar 14 18:33 stu..._oracle归档日志文件在哪

Mysql server出现“Mysql server has gone away”的错误的解决方式-程序员宅基地

文章浏览阅读3.7w次,点赞2次,收藏18次。一、最常见的原因分析及解决方法 wait_timeout 和 interactive_timeout在官方的文档中给出了出现“Mysql server has gone away”的错误的分析原因:https://dev.mysql.com/doc/refman/5.7/en/gone-away.html出现该问题的主要原因是:Mysql server服务器超时,并且关闭了与客户端的连接导致的。在这_mysql server has gone away

推荐文章

热门文章

相关标签