1. 程式人生 > >Timer定時任務排程Api及優缺點

Timer定時任務排程Api及優缺點

Timer是java.util自帶的類,該類可以完成定時任務排程功能,但是隻有一個後臺執行緒,所以不支援併發,而且當遇到執行時錯誤的時候會停止所有正在執行的任務。Quartz可以說是大哥,改善了這兩大缺陷。

Timer Api介面介紹:

這裡寫圖片描述

1.schedule(TimerTask,Date)是在計劃的時間點執行一次。

實驗一把:

先自定義一個TimerTask類

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class MyTimerTask
extends TimerTask{
@Override public void run() { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(df.format(scheduledExecutionTime()));// 列印任務真正執行時間 } }

測試類:

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import
java.util.Timer; public class Test { public static void main(String[] args) { Timer timer = new Timer(); MyTimerTask timeTask = new MyTimerTask(); Calendar calendar = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current time is "
+ df.format(calendar.getTime())); timer.schedule(timeTask, calendar.getTime()); } }

執行結果:

current time is 2018-01-03 09:36:23
2018-01-03 09:36:23

2.Timer.schedule(TimerTask task, long delay)

延遲delay毫秒之後執行一次,實驗結果如下:

這裡寫圖片描述

3.Timer.schedule(TimerTask task, Date firstTime, long period)

從fistTime開始,每隔period毫秒迴圈執行task任務

實驗結果:

這裡寫圖片描述

4.Timer.schedule(TimerTask task, long delay, long period)

延遲delay毫秒第一次執行,然後間隔period毫秒迴圈執行task任務。

實驗結果:

這裡寫圖片描述

5.Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

在firstTime第一次執行,間隔period毫秒迴圈執行,這個跟Timer.schedule(TimerTask task, Date firstTime, long period)是有區別的。主要是任務開始時間跟當前時間相比才體現出來,下面這種是看不出來的。

這裡寫圖片描述

實驗區別的地方:

首次計劃執行的時間早於當前時間

schedule的輸出:

這裡寫圖片描述

scheduleAtFixedRate的輸出:

這裡寫圖片描述

任務執行所需時間超出任務的執行週期間隔

改造下MyTimerTask,模擬任務執行需要3秒鐘,而間隔時間為2秒,看實驗結果的不同。

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask{

    @Override
    public void run() {
        // 模擬任務執行需要3秒鐘
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(scheduledExecutionTime()));// 列印任務真正執行時間
    }
}

scheduleAtFixedRate的輸出:

這裡寫圖片描述

schedule的輸出:

這裡寫圖片描述

6.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

同樣跟Timer.schedule(TimerTask task, long delay, long period)存在如上區別。

7.Timer.cancel()

任務取消執行
模擬場景:任務執行3次後停止任務執行。

public class MyTimerTask extends TimerTask{

    private int count = 0;
    private Timer myTimer;

    public MyTimerTask(Timer timer){
        myTimer = timer;
    }
    @Override
    public void run() {
        if(count<3){
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println(df.format(scheduledExecutionTime()));// 列印任務真正執行時間
            count++;
        }else{
            cancel();
            System.out.println("task canceled !");
        }

    }
}

這裡寫圖片描述

8.Timer.purge()

返回任務取消的個數

這裡寫圖片描述

JDK自帶的定時任務排程只需要瞭解這麼多即可,在平時的業務要求下,如果要支援併發性或者業務複雜的情況下,請使用Quartz框架,因為Timer滿足不了你!