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) ); } }注意: