首页 > 其他分享 >Spring线程池ThreadPoolTaskExecutor

Spring线程池ThreadPoolTaskExecutor

时间:2023-03-22 09:55:22浏览次数:41  
标签:队列 Spring command async taskExecutor 线程 ThreadPoolTaskExecutor

1. 线程池配置

@Configuration
public class TaskExecutorConfig implements AsyncConfigurer {

    @Value("${async.core.pool.size:10}") //核心线程数
    private Integer corePoolSize;

    @Value("${async.max.pool.size:40}") //最大线程数
    private Integer maxPoolSize;

    @Value("${async.queue.capacity:2000}") //任务队列
    private Integer queueCapacity;

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(corePoolSize);
        taskExecutor.setMaxPoolSize(maxPoolSize);
        taskExecutor.setQueueCapacity(queueCapacity);
        taskExecutor.setThreadNamePrefix("async-service-"); //线程池的前缀名称
        taskExecutor.initialize();
        return taskExecutor;
    }
(1)ThreadPoolTaskExecutor实际上就是通过initialize()方法实现对ThreadPoolExecutor的包装。
int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
(2)处理流程:源码如上,①判断核心线程数是否已满,没满则创建一条线程并执行任务;②若核心线程数已满,则判断任务队列是否已满,没满则创建一条线程放在队列等待执行;③若任务队列已满,则判断最大线程数是否已满,没满则创建一条线程并执行任务,否则执行拒绝策略。即优先核心线程,阻塞队列次之,最后才是非核心线程。

2. @Async注解

(1)@Async作用在方法上,表示这个方法是个异步方法;作用在类上,表示这个类里的所有方法都是异步方法。
(2)使用@Async注解,需要在启动类上加上@EnableAsync注解,否则多线程不生效。

标签:队列,Spring,command,async,taskExecutor,线程,ThreadPoolTaskExecutor
From: https://www.cnblogs.com/edmond58/p/17242515.html

相关文章

  • 2、Spring中的一些现象
    1、注入模型默认的注入模型:AbstractBeanDefinition.AUTOWIRE_NO=0通过构造方法注入1.1、setter方法名称注入模型AbstractBeanDefinition.AUTOWIRE_BY_NAME=11.1.1、现......
  • 线程-1
    1、创建执行线程有两种方法扩展Thread类(重新run方法)  @Overridepublicvoidrun(){}newMyThread().start();//启动线程 实现Runnable......
  • SpringBoot 第二部分知识点
    SpringBoot-第⼆天1.学习目标2Mybatis整合数据访问使用SpringBoot开发企业项目时,持久层数据访问是前端页面数据展示的基础,SpringBoot支持市面上常见的关系库......
  • springcloud学习——nacos
    1介绍nacos是阿里巴巴开发的,现在已属于springcloud框架,功能比eureka更加丰富2安装与启动下载:GitHub主页:https://github.com/alibaba/nacos解压安装包后,在bin文件夹中......
  • 线程
    线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的是KLT模型,java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有一个对应的线......
  • java线程池相关问题
    线程池有几种拒绝策略?当线程池的线程数达到最大线程数时,需要执行拒绝策略。拒绝策略需要实现RejectedExecutionHandler接口,并实现rejectedExecution(Runnabler, T......
  • 【Thread -- 1.1】 实现多线程的正确姿势
    【Thread--1.1】实现多线程的正确姿势一、实现多线程的方法有几种--两种1、正确方法--Oraclle官方文档--2种[Oraclle官方文档](Overview(JavaPlatformSE8)(ora......
  • SpringBoot 第一部分知识点
    SpringBoot-第⼀天1.学习目标 2.Spring框架发展史2.1.Spring1.x时代在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不......
  • Spring Cloud Alibaba系列(二)微服务监控组件Skywalking的简单使用
    SkyWalking是分布式链路调用服务监控组件,微服务上线后,需要监控运行指标,比如系统的吞吐量,服务响应时间,CPU内存暂用率,异常等信息,它通过Agent收集日志,可以把数据存储在ES,MySQL......
  • SMU Spring 2023 Trial Contest Round 1
    A.PrependandAppend如果两段字符不同就可以删掉,如果不能删了就是最初的字符串#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;stri......