1. 程式人生 > >Java多執行緒核心技術(五):定時器Timer

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,結果如下: