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滿足不了你!