Scheduling定时器使用
单线程(串行)
使用注解@Scheduled
PS:类上或者启动类上必须加上@EnableScheduling,多线程:使用@EnableAsync和@Async
@Scheduled(cron = "0/2 * * * * *") public void timerBreakCat(){ LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("Cat当前时间为:" + localDateTime.format(DateTimeFormatter.ofPattern("MM-dd HH:mm:ss"))); } @Scheduled(cron = "0/2 * * * * *") public void timerBreakDog(){ LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("Dog当前时间为:" + localDateTime.format(DateTimeFormatter.ofPattern("MM-dd HH:mm:ss"))); }
多线程(并行)
创建线程池
@Configurable public class ScheduleConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); return scheduler; } }
实现SchedulingConfigurer接口
@Configuration @Slf4j public class DemoTask implements SchedulingConfigurer { private static String cron = "0/5 * * * * ?"; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( //1.添加任务内容(Runnable) () -> new Thread(() -> { try { // TODO 任务内容 log.info("执行时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } catch (Exception e) { e.printStackTrace(); } }).start(), //2.设置执行周期(Trigger) triggerContext -> { //随机生成cron String temp = ((int) (Math.random() * 7+3))+""; cron = "0/"+temp+" * * * * ?"; //返回执行周期(Date) return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); } }