解决SpringBoot定时任务并发执行线程单例问题

Posted ITdfq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决SpringBoot定时任务并发执行线程单例问题相关的知识,希望对你有一定的参考价值。

测试

代码

package com.itdfq.springbootscheduled;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * @Author: GodChin
 * @Date: 2021/8/13 9:57
 * @Blog: itdfq.com
 * @QQ: 909256107
 * @Description:
 */
@Component
public class Test 
    @Scheduled(cron = "0/5 * * * * ?")
    public void test1()
        String name = Thread.currentThread().getName();
        System.out.println("当前时间:"+ LocalDateTime.now()+"  任务1对应的线程名: "+name);
        try 
            TimeUnit.SECONDS.sleep(1); //睡眠一秒
         catch (InterruptedException e) 
            e.printStackTrace();
        
    
    @Scheduled(cron = "0/5 * * * * ?")
    public void test2()
        String name = Thread.currentThread().getName();
        System.out.println("当前时间:"+ LocalDateTime.now()+"  任务2对应的线程名: "+name);
        try 
            TimeUnit.SECONDS.sleep(1); //睡眠一秒
         catch (InterruptedException e) 
            e.printStackTrace();
        
    


结果

原因分析


debug发现,如果taskScheduler为空,就会创建单例线程池,因此同时执行的任务用的都是同一个线程

解决办法

自己新建一个taskScheduler

  @Bean
    public TaskScheduler taskScheduler() 
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        return taskScheduler;
    

结果

以上是关于解决SpringBoot定时任务并发执行线程单例问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot中并发定时任务的实现动态定时任务的实现(看这一篇就够了)

SpringBoot @Scheduled多线程执行

SpringBoot多线程并发定时任务

SpringBoot 多线程和定时任务

SpringBoot 定时任务的使用

定时任务多线程的实现