Springboot实现异步调用定时程序

Springboot实现异步调用定时程序

试了加启动类上加@EnableAsync注解, 定时程序加@Async注解报错之后发现在启动类中加个方法可实现异步调用多个定时任务
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTaskScheduler();
taskExecutor.setPoolSize(50);
return taskExecutor;
}

手动指定线程池即可。

以下为转载https://blog.csdn.net/yaxuan88521/article/details/122392218

@Scheduled多个任务同时开始执行

只需在springBoot启动类上添加

如下代码即可:

@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTaskScheduler();
taskExecutor.setPoolSize(50);
return taskExecutor;
}
springBoot @Scheduled多任务同时开始执行springBoot @Scheduled多任务同时开始执行

@Scheduled多定时任务,重叠执行

@Scheduled如果有两个定时任务

定时任务重复时,只有一个可以执行。

如下

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class MyScheduled {
@Scheduled(cron = “0/5 * * * * ?”)
public void execute1(){
String curName = Thread.currentThread().getName() ;
System.out.println(“当前时间:”+LocalDateTime.now()+" 任务execute1对应的线程名: "+curName);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}

@Scheduled(cron = "0/5 * * * * ?")
public void execute2(){ 
    String curName = Thread.currentThread().getName() ;
    System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}
通过执行可以看到,打印线程名称为同一个。即如果不手动指定线程池,则默认启动单线程,进行执行定时任务。

如果想要多个定时任务重叠执行

需要手动指定线程池,如下

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
@EnableScheduling
public class MyScheduled {

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(50);
    return taskScheduler;
}

@Scheduled(cron = "0/5 * * * * ?")
public void execute1(){
    String curName = Thread.currentThread().getName() ;
    System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute1对应的线程名: "+curName);
    try {
        Thread.sleep(1000);
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

@Scheduled(cron = "0/5 * * * * ?")
public void execute2(){ 
    String curName = Thread.currentThread().getName() ;
    System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}
此时,多个定时任务,是不通的线程执行,同时,定时任务可以重叠执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值