ThreadPoolTaskExecutor配置

Easter79
• 阅读 564

一.项目中线程池的使用:

    参数配置:(application.yml配置文件中)  

  task:
    pool:
      corePoolSize: 10
      maxPoolSize: 50
      keepAliveSeconds: 300
      queueCapacity: 1000

    通过注解

@Component
@ConfigurationProperties(prefix = "spring.task.pool")

获取配置文件的参数设置:

    线程池配置:

@EnableAsync
@Configuration
public class ThreadPoolConfig {

    @Autowired
    private ThreadPoolProperties poolConfig;
    
    //定义线程池(同理可拓展)
    @Bean  
    public Executor testTaskAsyncPool() {  
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
        executor.setCorePoolSize(poolConfig.getCorePoolSize());  
        executor.setMaxPoolSize(poolConfig.getMaxPoolSize());  
        executor.setQueueCapacity(poolConfig.getQueueCapacity());  
        executor.setKeepAliveSeconds(poolConfig.getKeepAliveSeconds());  
        executor.setThreadNamePrefix("testExecutor-");  
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());  
        executor.initialize();  
        return executor;  
    }  
}

    参数说明:

    corePoolSize:核心线程数---10

            a.核心线程会一直存活,即使没有任务执行也存活

            b.当线程数少于核心线程数时,即使有空闲的线程,也会优先创建新的线程去处理。

            c.设置参数allowCoreThreadTimeout=true(默认false),核心线程会超时关闭。

    queueCapacity:任务队列容量(阻塞队列)---1000

            a.当核心线程数达到最大时,新任务会放在队列中排队等待执行。

    maxPoolSize:最大线程数---50

            a.当线程数大于corePoolSize时,且任务队列也已满,线程池会创建新的线程处理任务。

            b.当线程数=maxPoolSize,且任务队列已满,线程池会默认抛出异常拒绝执行任务。

    keepAliveSeconds:线程空闲时间---300

            a.当线程空闲时间达到这个设置时间时,线程会自动退出,直到线程数量=corePoolSize

            b.如果allowCoreThreadTimeout=true,则会直到线程数量=0

    rejectedExecutionHandler:任务拒绝处理器

            a.两种情况会拒绝处理任务

                1st.当线程数量已经达到maxPoolSize,且队列已满,就会拒绝新任务

              2nd.当线程池被调用shutdown后,会等线程池里任务执行完毕,再shutdown,如果在调用shutdown和线程池真正shutdown之间提交任务,会拒绝新任务。

            b.线程池会调用rejectedExecutionHandler来处理任务,默认是AbortPolicy,抛出异常

            c.ThreadPoolExecutor内部实现的方式:

                    c1.AbortPolicy  丢弃任务,抛运行时异常

                    c2.CallerRunsPolicy 执行任务

                    c3.DiscardPolicy 忽视,什么都不会发生

                    c4.DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务

            d.也可实现RejectedExecutionHandler接口,自定义处理器

ThreadPoolExecutor执行顺序:

1.当线程数小于核心线程数时,创建新线程

2.当线程数大于等于核心线程数时,且任务队列未满时,将任务放入任务队列

3.当线程数大于核心线程数,且任务队列已满时,

a.若线程数少于最大线程数,创建线程

b.若线程数等于最大线程数,抛出异常,拒绝任务

二.线程池的使用:

通过注解的方式使用,在方法上添加注解

   @Async("testTaskAsyncPool")

    可在业务代码的方法上直接调用即可。。。

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java四种线程池类型以及可选择的阻塞队列
之前笔记有记录java线程池的拒绝策略,回顾一下线程池的处理任务的优先级:先考虑corePoolSize、任务队列(缓冲队列)workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。即:如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队
Easter79 Easter79
3年前
springCloud 集群
5.1注册中心集群 1.复制注册中心项目   2.修改yml配置文件      注册中心1中引入注册中心2的url地址       2.1server1的application.yml配置           server:             port:7000           注
利用DUCC配置平台实现一个动态化线程池
在后台开发中,会经常用到线程池技术,但线程池核心参数的配置很大程度上依靠经验,所以我们很难一劳永逸地规划一个合理的线程池参数。本文以公司DUCC配置平台作为中心,以修改线程池核心线程数、最大线程数为例,实现一个简单的动态化线程池。
Easter79 Easter79
3年前
SpringCloud 启动时报No active profile set, falling back to default profiles default
这在Spring程序启动时没有找到默认的配置文件所引发的错误,默认文件application.yml如下图: !这里写图片描述(https://oscimg.oschina.net/oscnet/4a822ce35ff8ed227a2c57f496787d95e5a.png)一般在项目中都会有多个,如有正式环境、测试环境等。如下
Wesley13 Wesley13
3年前
MySQL主主复制(双主复制)配置过程介绍
一、修改配置文件my.cnf服务器A(172.16.16.70)配置如下server\_id70socket/tmp/mysql.sockinnodb\_buffer\_pool\_size10Gcharactersetserverutf8log\_binmysqlbinexpire\_l
Stella981 Stella981
3年前
Spring4.0 + druid 配置动态配置数据源以及多数据源切换功能实现
数据源连接池使用druid其他的数据源基本原理相同spring中配置默认数据源连接池如下:<!数据源配置,使用BoneCP数据库连接池   <beanid"dataSourceOne"class"com.alibaba.druid.pool.DruidDataSource"initmethod"
Stella981 Stella981
3年前
Maven使用 国内镜像配置
Maven使用国内镜像配置  Maven  setting.xml中配置<repositories<repository<idnexus</id<namelocalprivatenexus</name
Stella981 Stella981
3年前
BitCoinCore配置文件解读
bitcoin.conf配置文件除了datadir和conf以外的所有命令行参数都可以通过一个配置文件来设置,而所有配置文件中的选项也都可以在命令行中设置。命令行参数设置的值会覆盖配置文件中的设置。配置文件是“设置值”格式的一个列表,每行一个。您还可以使用符号来编写注释。配置文件
京东云开发者 京东云开发者
4个月前
动态线程池思想学习及实践
相关文档美团线程池实践:线程池思想解析:引言在后台项目开发过程中,我们常常借助线程池来实现多线程任务,以此提升系统的吞吐率和响应性;而线程池的参数配置却是一个难以合理评估的值,虽然业界也针对cpu密集型,IO密集型等场景给出了一些参数配置的经验与方案,但是
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k