解决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定时任务并发执行线程单例问题的主要内容,如果未能解决你的问题,请参考以下文章