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 去執行即可。