• SpringBoot ThreadPoolTaskScheduler 定时任务 多线程执行 demo


    1. pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>com.demo</groupId>
        <artifactId>springboot-scheduler-demo</artifactId>
        <version>1.0.0</version>
    
        <properties>
            <lombok.version>1.18.12</lombok.version>
        </properties>
    
        <dependencies>
            <!--web 模块-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--  lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
                <scope>provided</scope>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    
    </project>
    

    2. SchedulerApplication.java

    启动类

    @SpringBootApplication
    @EnableScheduling
    public class SchedulerApplication {
        public static void main(String[] args) {
            SpringApplication.run(SchedulerApplication.class, args);
        }
    }
    

    添加@EnableScheduling注解,启用定时任务。

    3. SchedulerConfig.java

    定时任务配置类

    @Configuration
    @EnableAsync
    public class SchedulerConfig {
    
        @Bean
        public Executor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // 设置线程名称前缀,默认为方法名(此处为taskExecutor)
            //executor.setThreadNamePrefix("task-");
            // 核心线程数
            executor.setCorePoolSize(10);
            // 最大线程数
            executor.setMaxPoolSize(100);
            // 等待队列容量
            executor.setQueueCapacity(50);
            // 空闲线程存活时间(单位:s)
            executor.setKeepAliveSeconds(300);
            executor.initialize();
            return executor;
        }
    

    添加@EnableAsync注解,启用多线程。

    线程池不同情况说明:

    • 若线程数 < corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
    • 若线程数 = corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
    • 若线程数 > corePoolSize,缓冲队列workQueue满,并且线程数 < maxPoolSize,创建新的线程来处理被添加的任务。
    • 若线程数 > corePoolSize,缓冲队列workQueue满,并且线程数 = maxPoolSize,那么通过handler所指定的策略来处理此任务。
      处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize。如果三者都满了,使用handler处理被拒绝的任务。
    • 若线程数 > corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。

    4. TestScheduler.java

    具体定时任务执行类

    @Slf4j
    @Component
    @Async
    public class TestScheduler {
    
        @Scheduled(cron = "0/3 * * * * *")
        public void test() {
            log.info("执行定时任务test1");
        }
    
        @Scheduled(cron = "0/6 * * * * *")
        public void test2() {
            log.info("执行定时任务test2");
        }
    }
    

    在类上添加@Async注解,类中的所有方法都会使用多线程执行任务。
    类上不添加,方法上添加@Async,仅添加过@Async的方法会使用多线程执行任务。

    5. cron表达式

    @Scheduled cron表达式

    // Update 2021年1月12日 增加Demo
    Demo

  • 相关阅读:
    长篇专访科比:成功没秘诀 只有不断努力
    生活哲理
    8个让程序员追悔莫及的职业建议
    优秀程序员必备十大习惯
    回顾马云屌丝岁月的惨状:多次被拒失声痛哭
    程序员,究竟该怎么赚钱?
    洛杉矶凌晨4点-------启航
    iOS越狱开发
    iOS越狱开发中遇到的坑
    macOS上搭建RabbitMQ+MQTT服务器
  • 原文地址:https://www.cnblogs.com/stonechen/p/14258539.html
Copyright © 2020-2023  润新知