標籤:new seh 管理工具 也會 ice 工具包 調度 常式 程式
1.java timer類,定時器類。啟動執行定時任務方法是timer.schedule(new RemindTask(), seconds*1000);倆參數分別是TimerTask子類,具體執行定時操作所執行的動作,後一個參數是豪秒,代表間隔多久執行一次。
2.TimerTask類,java.util.TimerTask,具體定時執行的操作。裡面有個run方法,和線程run方法一樣(就是線程)。
5.Timer是一種定時器工具,用來在一個後台線程計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。
TimerTask一個抽象類別,它的子類代表一個可以被Timer計劃的任務。
6.Timer可以定時多次執行任務,也可以讓Timer在固定時間只執行一次。全都是Timer.sehedule()方法,這是重載方法,可以傳多個參數。
timer.scheduleAtFixedRate(timerTask, firstTime, period);以固定間隔時間段多次執行。
timer.schedule(timerTask, firstTime);在固定時間執行一次。
7.Timer和TimerTask之間的關係,Timer是TimerTask的管理工具,一個Timer可以對應多個TimerTask,啟動多個TimerTask,並管理他們的執行。
既然是一個Timer可以綁定多個TimerTask,我們就在代碼裡可以封裝一個單例類,封裝Timer進去。然後用這一個Timer,去調度和管理所有的TimerTask
timerService.startTimerTask(new AlarmTimerTask(), 3 * 1000, 1 * 1000);
timerService.startTimerTask(new AlarmTimerTask2(), 3 * 1000, 1 * 1000);
8.static方法和普通方法沒有任何區別,static方法裡面的代碼,可以隨便new一個對象,前提是在代碼運行期間。不要再static代碼塊裡執行這個static方法就行。其他運行期間才調用的static方法,可以裡面隨便包含普通代碼。
如:public static TimerService getInstance() {
Timer timer = new Timer();
return instance;
}
2.java util包是個好用的包,裡面有logging日誌工具類,還有properties設定檔,timer類。所以確實是個工具包,臉面很多工具類。
java.util,logging
java.util.properties
java.util.timer
4.簡單的一個常式:
import java.util.Timer;
import java.util.TimerTask;
/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.println("Time‘s up!");
timer.cancel(); //Terminate the timer thread
}
}
public static void main(String args[]) {
System.out.println("About to schedule task.");
new Reminder(5);
System.out.println("Task scheduled.");
}
}
5.還有一種方法可以指定任務的執行時間,如下例,指定任務在11:01 p.m.執行:
//Get the Date corresponding to 11:01:00 pm today.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
Date time = calendar.getTime();
timer = new Timer();
timer.schedule(new RemindTask(), time);
2.終止Timer線程
預設情況下,只要一個程式的timer線程在運行,那麼這個程式就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:
調用timer的cancle方法。你可以從程式的任何地方調用此方法,甚至在一個timer task的run方法裡。
讓timer線程成為一個daemon線程(可以在建立timer時使用new Timer(true)達到這個目地),這樣當程式只有daemon線程的時候,它就會自動終止運行。
當timer相關的所有task執行完畢以後,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。
第二種方法:讓timer線程成為一個daemon線程(可以在建立timer時使用new Timer(true)達到這個目地),這樣當程式只有daemon線程的時候,它就會自動終止運行。
如果設成daemon,那麼當main線程 結束的時候,程式只剩下timer這個daemon線程,於是程式不會等timer線程執行task就終止了。
當timer相關的所有task執行完畢以後,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。
3.注意:一個Timer僅僅對應一個線程,並不是多個線程,而且Timer本身就是一個線程,。即使是間隔時間多次執行,也是同一個線程。一個Timer綁定的多個TimerTask都是運行在Timer這一個線程裡的。可以通過java代碼測試一下,Timer啟動倆TimerTask,在每個TimerTask裡輸出當前線程的名字thread.currentThread.getName(),肯定是一樣的。多個TimerTask是跑在一個Timer線程裡的,且這個線程名字就叫Timer-X
二。java.util.Timer定時器,實際上是個線程,定時調度所擁有的TimerTasks。
1什麼叫匿名內部類?new對象時候,直接寫出來實現代碼的類,就是建立匿名類
TimerTask task = new TimerTask() {
public void run() {
... //每次需要執行的代碼放到這裡面。
}
};
java Timer定時器管理類