springboot定时器(调度器多线程)@Scheduled的cron,fixedRate,fixedDelay使用

1:注意:使用cron在线生成器调试https://cron.qqe2.com/,看调试结果是否符合自己的要求

1、实现类上要有组件的注解@Component @Service(@Component相当于一个bean);
2、spring的@Scheduled注解 需要写在实现方法上,如:@Scheduled("cron = “0 0 0 * * ?”) (表示每天0点的定时任务);
3、定时器的任务实现方法内不能有返回值。
三、示例
0 * * * * ? 每1分钟触发一次
0 0 * * * ? 每天每1小时触发一次
0 0 10 * * ? 每天10点触发一次
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ? 每月1号上午9点半
0 15 10 15 * ? 每月15日上午10:15触发
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0 0 1 * ? 每月1号凌晨执行一次

/**
 * @Author xu
 * @create 2022/11/16
 */
@Service
@EnableScheduling
public class VibratorTableTask {
    @Autowired
    VibratorMapper vibratorMapper;

    /**
     * 定时生成震动器数据表,根据时间分表
     */

	//定时器每10分钟执行一次
    @Scheduled(cron = "0 */10 * * * * ")
    //定时器每1小时执行一次
//    @Scheduled(cron = "0 0 */1 * * * ")
//	单位是微妙
//	@Scheduled(fixedRate=1000)
//	@Scheduled(fixedDelay=1000)
    public void createTable() {
        //TODO   someting

    }
}

介绍及区别说明:
FixedRate----- > @Scheduled(fixedRate=5000)
第一个任务开始时间秒数为00:00:10;那么在5秒之后,15秒的时候,第二个任务就会立刻执行的。 若第一个任务执行划分10秒,第> > 二个任务的执行并不会受影响,还是会在00:00:15秒的时候执行。
FixedDelay---- > @Scheduled(fixedDelay=5000)
第一个任务开始时间秒数为00:00:10;那么第二个任务执行的时候,必须是第一个任务执行完再等5秒之后才能执行。 若第一个任务执行花费10秒,那么就说00:00:10++10+5秒,也就是00:00:25秒的时候,第二个任务才会执行。

2:@Scheduled是单线程的,可以设置线程吃使用方法

@Bean
public ThreadPoolTaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(5); // 设置线程池大小
    taskScheduler.setThreadNamePrefix("scheduled-task-pool-"); // 设置线程名称前缀
    taskScheduler.initialize();
    return taskScheduler;
}

注意:调度器多线程是对应多个@Scheduled而言可以并发执行的,类似execute(),定时每两秒执行一次,但是方法体睡眠了10秒,所以最终是12秒执行一次循环。如果没有调度器多线程,就需要排队,执行完一个@Scheduled方法execute(),再执行@Scheduled方法execute2()

    @Scheduled(cron = "*/2 * * * * ?")
    public void execute() throws InterruptedException {
        System.out.println("开始A:"+Thread.currentThread().getName()+":"+ new Date());
        Thread.sleep(10000);
        System.out.println("结束A:"+Thread.currentThread().getName()+":"+ new Date());
    }

    @Scheduled(cron = "*/2 * * * * ?")
    public void execute2() throws InterruptedException {
        System.out.println("开始B:"+Thread.currentThread().getName()+":"+ new Date());
        Thread.sleep(10000);
        System.out.println("结束B:"+Thread.currentThread().getName()+":"+ new Date());
    }

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值