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);
                }
        );
    }
}

cron表达式

生成器网站 http://www.bejson.com/othertools/cron/

posted @ 2019-08-08 15:34  21克的小怪兽  阅读(350)  评论(0编辑  收藏  举报