Java多執行緒核心技術(五):定時器Timer
Timer類主要負責計劃任務的功能,也就是在指定的時間開始執行某一個任務。
1、schedule(TimerTask task,Date time)
方法schedule(TimerTask task,Date time)的作用是在指定的日期執行一次某一任務。
如下程式碼是執行時間晚於當前時間的示例:
執行結果如下:public class TestClass{ private static Timer timer = new Timer(); static public class MyTask extends TimerTask{ @Override public void run(){ System.out.println("運行了!時間為:"+new Date()); } } public static void main(String[] args) throws InterruptedException{ try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = "2017-02-28 15:13:00"; Date dateRef; dateRef = sdf.parse(dateString); System.out.println("計劃執行時間: " + dateRef.toLocaleString()+"\n當前時間:"+new Date().toLocaleString()); timer.schedule(task, dateRef); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
當計劃執行任務的時間早於當前時間時,則立即執行task任務。
TimerTask是以佇列的方式一個一個被順序執行的,所以執行的時間有可能和預期的時間不一致,因為前面的任務有可能消耗的時間較久,則後面的任務執行的時間也會被延遲。
2、schedule(TimerTask task,Date firstTime,long period)
方法schedule(TimerTask task,Date firstTime,long period)的作用是在指定的日期之後,按指定的間隔週期性地無限迴圈地執行某一任務。
TimerTask類中的cancel()方法的作用是將自身從任務佇列中清除。
Timer類中的cancel()方法的作用是將任務佇列中的全部任務清空。
3、schedule(TimerTask task,long delay)
方法schedule(TimerTask task,long delay)的作用是以執行schedule(TimerTask task,long delay)方法當前的時間為參考時間,在此時間基礎上延遲指定的毫秒數後執行一次TimerTask任務。
4、schedule(TimerTask task,long delay,long period)
方法schedule(TimerTask task,long delay,long period)的作用是以執行此方法的當前時間為參考時間,在此時間基礎上延遲指定的毫秒數,再以某一間隔時間無限次數地執行某一任務。
5、scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
使用schedule方法:如果執行任務的時間沒有被延時,那麼下一次任務的執行時間參考的是上一次任務的“開始”時的時間來計算。
使用scheduleAtFixedRate方法:如果執行任務的時間沒有被延時,那麼下一次任務的執行時間參考的是上一次任務的“結束”時時間來計算。
延時情況時,兩者下一次任務執行的時間參考都是上一次任務結束時的時間。
注:如果計劃任務的執行時間早於當前時間,則schedule不會執行時間差內的任務,而 scheduleAtFixedRate會執行時間差內的任務,如下程式碼可測試這一點:
public class TestClass{
private static Timer timer = new Timer();
static public class MyTask extends TimerTask{
@Override
public void run(){
System.out.println("運行了!時間為:"+new Date());
}
}
public static void main(String[] args) throws InterruptedException{
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-02-28 15:50:00";
Date dateRef;
dateRef = sdf.parse(dateString);
System.out.println("計劃執行時間: " + dateRef.toLocaleString()+"\n當前時間:"+new Date().toLocaleString());
timer.schedule(task, dateRef, 10000);
//timer.scheduleAtFixedRate(task, dateRef, 10000);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
執行結果如下:
把schedule換成scheduleAtFixedRate,結果如下: