• spring 定时任务 taskScheduler详解


    spring 3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态。也可以使用cron表达式设置定时任务。

    被执行的类要实现Runnable接口

    TaskScheduler接口

    TaskScheduler是一个接口

    TaskScheduler接口下定义了6个方法

    • schedule(Runnable task, Trigger trigger);
      指定一个触发器执行定时任务。可以使用CronTrigger来指定Cron表达式,执行定时任务
     CronTrigger t = new CronTrigger("0 0 10,14,16 * * ?");
     taskScheduler.schedule(this, t);
    
    • schedule(Runnable task, Date startTime);
      指定一个具体时间点执行定时任务,可以动态的指定时间,开启任务。只执行一次。(比Timer好用多了。早发现这接口就好了。。。)
    • scheduleAtFixedRate(Runnable task, long period);
      立即执行,循环任务,指定一个执行周期(毫秒计时)
      PS:不管上一个周期是否执行完,到时间下个周期就开始执行
    • scheduleAtFixedRate(Runnable task, Date startTime, long period);
      指定时间开始执行,循环任务,指定一个间隔周期(毫秒计时)
      PS:不管上一个周期是否执行完,到时间下个周期就开始执行
    • scheduleWithFixedDelay(Runnable task, long delay);
      立即执行,循环任务,指定一个间隔周期(毫秒计时)
      PS:上一个周期执行完,等待delay时间,下个周期开始执行
    • scheduleWithFixedDelay(Runnable task, Date startTime, long delay);
      指定时间开始执行,循环任务,指定一个间隔周期(毫秒计时)
      PS:上一个周期执行完,等待delay时间,下个周期开始执行

    TaskScheduler下有五个实现类

    • ConcurrentTaskScheduler
      以当前线程执行任务。如果任务简单,可以直接使用这个类来执行。快捷方便。
      PS:这是单线程运行
    public class LocTest implements Runnable {
      private ConcurrentTaskScheduler tpts = new ConcurrentTaskScheduler();
      private void start() {
        tpts.schedule(this, new Date());
      }
      public void run() {
        Thread ct = Thread.currentThread();
        System.out.println("current id:"+ct.getId());
        System.out.println("current name:"+ct.getName());
      }
      public static void main(String[] args) {
        new LocTest().start();
      }
    }
    
    • DefaultManagedTaskScheduler
      以当前线程执行任务,这是ConcurrentTaskScheduler的子类,添加了JNDI的支持。和ConcurrentTaskScheduler一样的用法,需要使用JNDI可以单独设置
    • ThreadPoolTaskScheduler
      TaskScheduler接口的默认实现类,多线程定时任务执行。可以设置执行线程池数(默认一个线程)。
      PS:
      • 使用前必须得先调用initialize()【初始化方法】
      • 有shutDown()方法,执行完后可以关闭线程
    public class LocTest implements Runnable {
    	private ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    	private void start() {
    		taskScheduler.setPoolSize(10);
    		//必须得先初始化,才能使用
    		taskScheduler.initialize();
    		taskScheduler.schedule(this, new Date());
    	}
    	public void run() {
    		Thread ct = Thread.currentThread();
    		System.out.println("current id:"+ct.getId());
    		System.out.println("current name:"+ct.getName());
    	}
    	public static void main(String[] args) {
    		new LocTest().start();
    	}
    }
    
    • TimerManagerTaskScheduler
      这个没有使用到,就没具体了解,有时间再补充。有了解的欢迎来补充。
  • 相关阅读:
    SAS学习 day10
    SAS学习 day9
    SAS学习 day8
    Python解释器 发展史
    os. 模块
    字典
    类型1
    计算机编码
    EDA 会议整理
    2020-8-27
  • 原文地址:https://www.cnblogs.com/ElEGenT/p/6392465.html
Copyright © 2020-2023  润新知