java Timer定時器管理類

來源:互聯網
上載者:User

標籤: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定時器管理類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.