 闽公网安备 35020302035485号
                
                闽公网安备 35020302035485号
                2.基于接口SchedulingConfigurer
	
@Scheduled(cron = "*/2 * * * * ?")
public void testA() throws InterruptedException {
    log.info("testA 执行==============");
    Thread.sleep(5000);
}
@Scheduled(cron = "*/2 * * * * ?")
public void testB() throws InterruptedException {
    log.info("testB 执行==============");
    Thread.sleep(5000);
}
执行结果2023-03-20 09:15:46.007 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:15:51.009 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行============== 2023-03-20 09:15:56.015 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:16:01.019 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行============== 2023-03-20 09:16:06.028 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:16:11.038 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行==============可以明显看出两个任务是串行执行,后面会介绍如何实现多任务并行执行
@Configuration
public class TestJob2 implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //堆代码 duidaima.com
        //模拟多任务,实际可以从数据库或配置文件获取
        for(int i =0;i<3;i++){
            int finalI = i;
            //1.添加任务内容(Runnable)
            Runnable runnable = () -> {
                System.out.println("执行动态定时任务"+ finalI +":" + LocalDateTime.now());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            };
            //2.任务触发器
            Trigger trigger = triggerContext -> {
                //获取定时触发器,可以从数据库或配置文件获取最新记录,更新触发器实现定时间隔的动态调整
                CronTrigger cronTrigger = new CronTrigger("*/2 * * * * ?");
                return cronTrigger.nextExecutionTime(triggerContext);
            };
            //3.注册任务
            scheduledTaskRegistrar.addTriggerTask(runnable, trigger);
        }
    }
}
执行结果执行动态定时任务0:2023-03-20T09:47:38.010 执行动态定时任务1:2023-03-20T09:47:43.015 执行动态定时任务2:2023-03-20T09:47:48.019 执行动态定时任务0:2023-03-20T09:47:53.026 执行动态定时任务1:2023-03-20T09:47:58.040 执行动态定时任务2:2023-03-20T09:48:03.048可以明显看出两个任务是串行执行,后面会介绍如何实现多任务并行执行
@Configuration
public class ScheduleConfig {
    /**
     * 修复同一时间无法执行多个定时任务问题。@Scheduled默认是单线程的
     */
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        //核心线程池数量,方法: 返回可用处理器的Java虚拟机的数量。
        taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2);
        return taskScheduler;
    }
}
方式二:spring:
  application:
    name: test-task
  task:
    scheduling:
      pool:
        size: 8 #配置Scheduled定时任务为多线程
方式三:@Configuration
public class ScheduleConfig1 implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(
                new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2)
        );
    }
}
注意: