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
    這個沒有使用到,就沒具體了解,有時間再補充。有了解的歡迎來補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM