整理一下可以定时执行任务的几个方法

方法一

jdk提供的定时器工具Timer

  1. 单线程

  2. 可以指定延迟(开始执行的时间)、周期时间

  3. 可以调度指定的的需要执行的任务

  • 若只执行一次
//指定开始的时间执行一次任务
public void timerOnce(Date startDate) {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("operate..");
            //终止
            timer.cancel();
        }
    }, startDate);
    //这个参数是开始执行的时间,也可以设为延迟的时间,如3000ms
}
  • 若有循环周期
public void timerMore() {
    // 需要定时执行的任务
    TimerTask task = new TimerTask() {
        public void run() {
            System.out.println("-----定时测试-----");
        }
    };
    // Timer定时器工具
    Timer timer = new Timer();
    // 延迟(首次执行的时间)
    long delay = 0;
    // 间隔周期(/毫秒数)
    long intevalPeriod = 5 * 1000;
    ////立即执行,并且每5秒执行一次
    timer.scheduleAtFixedRate(task, delay, intevalPeriod);
}

方法二

  1. 通过线程池的方式来执行任务

  2. 可以设定时间颗粒度

  • TimeUnit.DAYS //天 
  • TimeUnit.HOURS  //小时       
  • TimeUnit.MINUTES //分钟  
  • TimeUnit.SECONDS //秒       
  • TimeUnit.MILLISECONDS //毫秒       
  • TimeUnit.NANOSECONDS //毫微秒                           
  • TimeUnit.MICROSECONDS //微秒
/**
 * ses.scheduleAtFixedRate(执行任务, 延迟(首次执行的时间), 周期, 延迟/周期的单位);
 */
public void timer2() {
    // 需要定时执行的任务
    Runnable runnable = new Runnable() {
        public void run() {
            System.out.println("-----定时器-----");
        }
    };
    ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

    //立即执行,并且每5秒执行一次
    ses.scheduleAtFixedRate(runnable, 0, 5000, TimeUnit.MILLISECONDS);
}

方法三

使用springboot注解

  • 在主方法入口添加@EnableScheduling
  • 任务调度的方法上面加注解 @Scheduled
  1. cron属性:时间表达式

  2. fixedRate属性:上一个调用开始后再次调用的延时(再次调用时不需要等上一个调用执行完成)

  3. fixedDelay属性:上一个调用完成后再次调用的延时(再次调用时需要等上一个调用执行完成)

  4. initialDelay属性:第一次调用时的延迟时间

wefbewfbwecwe.png

  • 通常情况下,任务调度需要配合异步功能,所以类只需要再添加一个注解@Async
//second minute hour day_of_month month day_of_week
@Scheduled(cron = "0 * * * * MON-SAT")
@Async
public void hello(){
    System.out.println("hello");
}

hhhhh