Timer+Task實現java定時任務

package com.xxx;

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

public class TimerManager {
	public static void main(String[] args) {
		timerMethod();
	}

	public static void timerMethod() {
		TimerTask tt = new TimerTask() {
			@Override
			public void run() {
				System.out.println("doing");
			}
		};
		Date time = gettime();
		Timer t = new Timer();
		t.schedule(tt, time, 2000); // 每隔2秒執行一次
		// t.schedule(tt, new Date(), 2000); //從當前時間開始執行,每隔2秒執行一次
	}

	/**
	 * 獲取執行任務的時間
	 * @return 時間
	 */
	private static Date gettime() {
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH);
		int day = cal.get(Calendar.DAY_OF_MONTH);
		cal.set(year, month, day, 23, 7, 0); // 23點7分之後執行
		Date time = cal.getTime();
		return time;
	}
}
下面這個同理,只是稍微改變:
package com.xxx;

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

public class TimerManager {
	
	public static final int PERIOD = 2 * 1000; //執行週期,每兩秒執行一次
	
	public static void main(String[] args) {
		timerMethod();
	}

	public static void timerMethod() {
		Date time = gettime();
		Timer t = new Timer();
		t.schedule(new MyTask(), time, PERIOD); // 每隔2秒執行一次
	}

	/**
	 * 獲取執行任務的時間
	 * @return 時間
	 */
	private static Date gettime() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59); //這裏的小時和分鐘按實際情況編寫
		calendar.set(Calendar.SECOND, 0);
		Date time = calendar.getTime();
		Date current = new Date();
		if(time.after(current)){ //如果任務執行時間在當前時間之後,則設置在3秒後執行任務
			time = addDay(current,3);
		}
		return time;
	}
	
	/**
	 * 增加或者減少天數、小時數、分鐘數等
	 * @param date
	 * @param num
	 * @return
	 */
	public static Date addDay(Date date, int num) {  
        Calendar startDT = Calendar.getInstance();  
        startDT.setTime(date);  
        startDT.add(Calendar.SECOND, num);  
        return startDT.getTime();  
    }  
}

class MyTask extends TimerTask{
	
	public static int count = 0;
	
	@Override
	public void run() {
		count++;
		System.out.println("timer task running. count = " + count);
	}
}
1、構造方法

①Timer timer = new Timer();

②定時器爲守護進程
	boolean flag=true;
	Timer timer1 =new Timer(flag);

③指定定時器的名字,方便指定停止 
	String name="TimerName2";
	Timer timer2 =new Timer(name);

④指定定時器的名字,並指定爲守護進程 
	String name3="TimerName3";
	Timer timer3 =new Timer(name3, flag);

2、方法

①延時delay時間後執行task
	public void schedule(TimerTask task,long delay)

②指定時間執行task
	public void schedule(TimerTask task,Date time)

③period:間隔週期  delay:執行延時週期 開始delay時間後間隔period執行task
	public void schedule(TimerTask task, long delay,long period)

④間隔period時間,在指定firstTime時間執行
	public void schedule(TimerTask task,Date firstTime,long period)

⑤period:間隔週期  delay:執行延時週期 開始delay時間後間隔period執行task
	public void scheduleAtFixedRate(TimerTask task,long delay,long period)

⑥間隔period時間,在指定firstTime時間執行
	public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 

⑦定時器停止運行
	public void cancel()

⑧從這個計時器的任務隊列中移除所有已取消的任務。
	public int purge()

4、總結
Timer 的優點:簡單易用
Timer 的缺點:
	①. Timer是基於絕對時間的。容易受系統時鐘的影響。 
	②. 單線程。所有TimeTask可能會相關影響 
	③. Timer不會捕獲TimerTask的異常,只是簡單地停止。這樣勢必會影響其他TimeTask的執行。

Timer 實現任務調度的核心類:Timer 和 TimerTask。 Timer 負責設定 TimerTask 的起始與間隔執行時間。

Timer 的設計核心:TaskList 、TaskThread。Timer 將接收到的任務丟到自己的 TaskList 中,TaskList 按照 Task 的最初執行時間進行排序。TimerThread 在創建Timer時會啓動成爲一個守護線程。這個線程會輪詢所有任務,找到一個最近要執行的任務,然後休眠,當到達最近要執行任務的開始時間點,TimerThread 被喚醒並執行該任務。之後 TimerThread 更新最近一個要執行的任務,繼續休眠。

Timer 使用:使用者只需要創建一個 TimerTask 的繼承類,實現自己的 run 方法,然後將其丟給 Timer 去執行即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章