1. 程式人生 > >Timer定時器 (詳細講解)

Timer定時器 (詳細講解)

Timer定時器主要做定時任務或者按照一定的時間間隔做任務,例如每天4點鐘定時執行作業等

Timer的特性
1、它屬於單執行緒的,每建立個Timer例項,就會建立一個新執行緒
2、Timer預設情況下不是守護執行緒,可以設定為守護執行緒new Timer(true),守護執行緒再程序中沒有其他執行緒時,守護執行緒將銷燬
3、TimerTask是以佇列的方式一個個的執行
4、TimerTask中的cancel()方法將自身中從佇列中清除
5、Timer中的cancel()方法是將任務佇列中的全部任務進行取消,有時並不一定停止任務,原因是Timer類中的cancel()方法有時並沒有競爭到鎖,
(這個可以從Timer原始碼中看到,TimerThread和TaskQueue兩個內部類)
6、TimerTask中的run方法無法丟擲,所以要進行try catch捕獲,如果其中任何一個任務發生異常沒有被捕獲,則其他任務也將被終止

方法詳解:
(1)schedule(TimerTask task, Date executeTime)
當executeTime<=currentTime時,task任務會在currentTimer立即執行
當executeTime>currentTime時,task會在未來的executeTime執行

(2)schedule(TimerTask task, Date firstTime, long period)
當firstTime <=currentTime時,task任務會在currentTimer立即執行,
當firstTime >currentTime時,task會在未來的executeTime執行,
執行任務所用的時間taskUsedTime<peroid,則下一個任務執行的時間是上次任務執行完成的時間+peroid,任務按時間間隔peroid週期性執行任務
執行任務所用的時間taskUsedTime>peroid,則下一個任務執行的時間是上次任務執行完成的時間+taskUsedTime,任務按時間間隔taskUsedTime 週期性執行任務

(3)schedule(TimerTask task, long delay)
任務延遲delay毫秒進行執行

(4)schedule(TimerTask task, long delay, long period)
A、延遲delay毫秒第一次執行,
B、執行任務所用的時間taskUsedTime<peroid,則下一個任務執行的時間是上次任務執行完成的時間+peroid, 任務按時間間隔peroid週期性執行任務
C、執行任務所用的時間taskUsedTime>peroid,則下一個任務執行的時間是上次任務執行完成的時間+taskUsedTime, 任務按時間間隔taskUsedTime 週期性執行任務

(5)scheduleAtFixedRate(TimerTask task, long delay, long period)

(6)scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
startTime = currentTime
A、當firstTime>currentTime,任務則在currentTime執行
B、當firstTime<currentTime,任務會發生追趕執行,追趕執行的次數expectCount=(currentTime-firstTime)/peroid+1;
第一個peroid屬於追趕階段,如果追趕上則等待執行startTime+peroid時間任務,如果沒有追趕上則直接執行startTime+peroid時間的任務

具體案例(程式碼):

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**

  • 定時器
  • @author Administrator

*/
public class Test01 {

public static void main(String[] args) throws InterruptedException {
	//1)建立物件

// Timer timer = new Timer();
Timer timer = new Timer(true); //定時器是一個守護執行緒

	//2)執行任務 

// timer.schedule(task, delay); //延遲delay毫秒後執行task任務
// timer.schedule(task, time); //在time這個時間執行task任務
// timer.schedule(task, delay, period); //延遲delay毫秒後執行task任務,以後每隔period毫秒重複執行task任務

	timer.schedule(new TimerTask() {
		@Override
		public void run() {
			System.out.println("2018俄羅斯世界盃正在進行中....");
			System.out.println( new Date() );
		}
	},  2000 , 1000); 		//2000毫秒後列印一行字串
	
	Thread.sleep(10000);
}

}