spring 定時任務 taskScheduler詳解

spring 3.0版本後,自帶了一個定時任務工具,並且使用簡單方便,不用配置文件,能夠動態改變執行狀態。也能夠使用cron表達式設置定時任務。spring

被執行的類要實現Runnable接口多線程

TaskScheduler接口

TaskScheduler是一個接口工具

TaskScheduler接口下定義了6個方法
this

  • 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 這個沒有使用到,就沒具體瞭解,有時間再補充。有了解的歡迎來補充。
相關文章
相關標籤/搜索