Springboot多线程定时任务

  • 第一需要配置启动类注解开启定时任务功能(开启才可以使用)
@EnableScheduling
public class Application {...}
  • 第二新建类AsyncConfig,代码如下
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;

/**
 * @ClassName:AsyncConfig
 * @Description: * @Configuration:表明该类是一个配置类
 * * @EnableAsync:开启异步事件的支持
 * 在定时任务的类或者方法上添加@Async 。
 * 最后重启项目,每一个任务都是在不同的线程中
 * //------------------------------------------
 * 项目中使用方法:
 * 1.启动类中添加 @EnableScheduling 注解开启定时
 * 2.业务类中添加 @Async(也可在方法中添加)  支持多线程
 * @Component 注解
 * 3.定时处理方法中添加 @Scheduled 使用 cron 表达式 如 每天一点十分执行:"0 10 1 * * *"
 * 秒         0~59               , - * /
 * 分         0~59               , - * /
 * 小时         0~23               , - * /
 * 日期         1-31               , - * ? / L W C
 * 月份         1~12或者JAN~DEC         , - * /
 * 星期         1~7或者SUN~SAT         , - * ? / L C #
 * 年(可选)   留空,1970~2099          , - * /
 * @Author:lids
 * @CreateDate: 2018/6/5 9:58
 */
@Configuration
@EnableAsync
public class AsyncConfig {
    /**
     * 此处成员变量应该使用@Value从配置中读取
     * corePoolSize:如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
     * maxPoolSize:最大线程
     * queueCapacity:等待队列的大小
     * (1)定长线程池和单线程线程都使用LinkedBlockingQueue,而LinkedBlockingQueue默认的大小是int的最大值。
     * (2)计划线程池使用的是DelayedWordQueue,它默认大小是16,但是可以动态增长,最大值则是int的最大值。
     * (3)缓存线程池使用的则是SynchronousQueue,这个比较特殊没有所谓的饱和值,而且前面也看到了缓存线程池的corePoolSize默认是0,所以它新建一个线程与SynchronousQueue的机制有关。
     * allowCoreThreadTimeOut:是否允许核心线程超时退出。
     * 如果该值为false,且poolSize<=corePoolSize,线程池都会保证这些核心线程处于存活状态,不会超时退出。
     * 如果为true,则不论poolSize的大小,都允许超时退出。
     * 如果poolSize>corePoolSize,则该参数不论true还是false,都允许超时退出。
     * 相关判断如下:
     * (poolSize > corePoolSize || allowCoreThreadTimeOut)
     * keepAliveTime:
     * 如果一个线程处在空闲状态的时间超过了该属性值,就会因为超时而退出。是否允许超时退出则取决于上面的逻辑。
     */
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);

        executor.initialize();
        return executor;
    }
}
  • 第三找到你定时任务的方法加上定时任务即可,需要注意的是如果同时六点执行就需要多线程,如果时间是错开执行的可以不用开启多线程,开启多线程的方式是添加 @Async注解
    @Async
    @Scheduled(cron = "0 0 6 * * ?")
    public void abc() {
        logger.info("定时任务内容");
    }
    @Async
    @Scheduled(cron = "0 0 6 * * ?")
    public void abcd() {
        logger.info("定时任务内容");
    }
  •  定时任务@Component 注解说明:
     * 定时处理方法中添加 @Scheduled 使用 cron 表达式 如 每天一点十分执行:"0 10 1 * * *"
     * 秒                  0~59                                 , - * /
     * 分                  0~59                                 , - * /
     * 小时              0~23                                 , - * /
     * 日期              1-31                                  , - * ? / L W C
     * 月份              1~12或者JAN~DEC         , - * /
     * 星期              1~7或者SUN~SAT           , - * ? / L C #
     * 年(可选)   留空,1970~2099            , - * /

举例说明

@Scheduled(cron = "*/5 * * * * ? 		")//每隔5秒执行一次
@Scheduled(cron = "0 */1 * * * ? 		")//每隔1分钟执行一次
@Scheduled(cron = "0 0 5-15 * * ?		")//每天5-15点整点触发
@Scheduled(cron = "0 0/3 * * * ? 		")//每三分钟触发一次
@Scheduled(cron = "0 0-5 14 * * ? 		")//在每天下午2点到下午2:05期间的每1分钟触发 
@Scheduled(cron = "0 0/5 14 * * ? 		")//在每天下午2点到下午2:55期间的每5分钟触发
@Scheduled(cron = "0 0/5 14,18 * * ?	")//在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
@Scheduled(cron = "0 0/30 9-17 * * ?	")//朝九晚五工作时间内每半小时
@Scheduled(cron = "0 0 10,14,16 * * ?   ")//每天上午10点,下午2点,4点 

@Scheduled(cron = "0 0 12 ? * WED 				")//表示每个星期三中午12点
@Scheduled(cron = "0 0 17 ? * TUES,THUR,SAT 	")//每周二、四、六下午五点
@Scheduled(cron = "0 10,44 14 ? 3 				")//WED 每年三月的星期三的下午2:10和2:44触发 
@Scheduled(cron = "0 15 10 ? * MON-FRI 			")//周一至周五的上午10:15触发
@Scheduled(cron = "0 0 23 L * ? 				")//每月最后一天23点执行一次
@Scheduled(cron = "0 15 10 L * ? 				")//每月最后一日的上午10:15触发 
@Scheduled(cron = "0 15 10 ? * 6L 				")//每月的最后一个星期五上午10:15触发 
@Scheduled(cron = "0 15 10 * * ? 2019 			")//2019年的每天上午10:15触发 
@Scheduled(cron = "0 15 10 ? * 6L 2019-2020		")// 2019年至2020年的每月的最后一个星期五上午10:15触发 
@Scheduled(cron = "0 15 10 ? * 6#3 				")//每月的第三个星期五上午10:15触发
                                                
@Scheduled(cron = "30 * * * * ?					")//每半分钟触发任务
@Scheduled(cron = "30 10 * * * ? 				")//每小时的10分30秒触发任务
@Scheduled(cron = "30 10 1 * * ? 				")//每天1点10分30秒触发任务
@Scheduled(cron = "30 10 1 20 * ? 				")//每月20号1点10分30秒触发任务
@Scheduled(cron = "30 10 1 20 10 ? *			")//每年10月20号1点10分30秒触发任务
@Scheduled(cron = "30 10 1 20 10 ? 2019			")//2019年10月20号1点10分30秒触发任务
@Scheduled(cron = "30 10 1 ? 10 * 2019 			")//2019年10月每天1点10分30秒触发任务
@Scheduled(cron = "30 10 1 ? 10 SUN 2019		")//2019年10月每周日1点10分30秒触发任务
@Scheduled(cron = "15,30,45 * * * * ? 			")//每15秒,30秒,45秒时触发任务
@Scheduled(cron = "15-45 * * * * ?				")//15到45秒内,每秒都触发任务
@Scheduled(cron = "15/5 * * * * ? 				")//每分钟的每15秒开始触发,每隔5秒触发一次
@Scheduled(cron = "15-30/5 * * * * ?			")//每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
@Scheduled(cron = "0 0/3 * * * ? 				")//每小时的第0分0秒开始,每三分钟触发一次
@Scheduled(cron = "0 15 10 ? * MON-FRI 			")//星期一到星期五的10点15分0秒触发任务
@Scheduled(cron = "0 15 10 L * ? 				")//每个月最后一天的10点15分0秒触发任务
@Scheduled(cron = "0 15 10 LW * ? 				")//每个月最后一个工作日的10点15分0秒触发任务
@Scheduled(cron = "0 15 10 ? * 5L 				")//每个月最后一个星期四的10点15分0秒触发任务
@Scheduled(cron = "0 15 10 ? * 5#3 				")//每个月第三周的星期四的10点15分0秒触发任务 


 

 

 

你可能感兴趣的:(java,SpringBoot)