Spring Boot使用@Scheduled定时任务

一 Spring Boot 启动类

需要加上@EnableScheduling注解。

package com.lanhuigu.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * Spring Boot启动类
 *
 * @author yihonglei
 */
@SpringBootApplication
@EnableScheduling
public class BootApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }
}

二 @Scheduled注解标识任务

创建两个任务,均方法执行完后一秒执行一次,其中test02停顿1分钟。

package com.lanhuigu.springboot.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 通过@Scheduled创建任务
 *
 * @author yihonglei
 * @date 2019/1/7 16:54
 */
@Component
public class BootTask {

    @Scheduled(fixedDelay = 1000)
    public void test01() {
        System.out.println("test01 start");
        System.out.println("执行业务逻辑...");
        System.out.println("test01 end");
    }

    @Scheduled(fixedDelay = 1000)
    public void test02() {
        System.out.println("test02 start");
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("test02 end");
    }

}

三 任务测试

启动Spring Boot应用,观察控制台输出。

如果执行test02,哪么test01会等一分钟后才执行,因为要等test02执行完才执行。

是不是刷新了世界观,按常理test01和test02各自执行自己的,为什么会干扰?

是因为@Scheculed默认的线程池是单线程的,任务放在delayQueue队列,排队执行的,

所以才会出现等待情况,解决这个问题的办法就是把默认线程改成多线程的。

四 修改@Scheculed默认线程池为多线程

package com.lanhuigu.springboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;

/**
 * 修改Spring Scheculed默认线程池
 *
 * @author yihonglei
 * @date 2019/1/7 15:47
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(10,
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r, "my-schedule-pool");
                    }
                }));
    }
}

修改默认线程池为多线程,这里给了10个线程。

然后再次启动Spring Boot,我们会发现test01一秒执行一次,test02该等一分钟还是等一分钟,

两个任务之间就不会出现等待现象。 

你可能感兴趣的:(#,---SpringBoot基础)