這兩個類使用起來非常友善,可以完成我們對定時器的絕大多數需求
timer類是用來執行任務的類,它接受一個timertask做參數
timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(data),2:在某個固定的時間之後(int delay).這兩種方式都可以指定任務執行的頻率
timertest.java:
package com.cn;
import java.io.ioexception;
import java.util.timer;
public class timertest{
public static void main(string[] args){
timer timer = new timer();
timer.schedule(new mytask(), 1000, 2000);//在1秒後執行此任務,每次間隔2秒執行一次,如果傳遞一個data參數,就可以在某個固定的時間執行這個任務.
while(true){//這個是用來停止此任務的,否則就一直循環執行此任務
try{
int in = system.in.read();
if(in == 's'){
timer.cancel();//使用這個方法退出任務
break;
}
} catch (ioexception e){
// todo auto-generated catch block
e.printstacktrace();
}
}
}
static class mytask extends java.util.timertask{
public void run(){
system.out.println("________");
}
此類運作時:
程式啟動1秒後在控制台列印“————”
間隔兩秒後接着執行mytask的run()方法,列印“————”
這樣一直循環
當在控制台輸入s字元時,timer定時器取消工作
跳出整個循環
程式運作結束!
timertest2.java:
import java.util.date;
public class timertest2{
mytask mytask1 = new mytask();
mytask mytask2 = new mytask();
mytask2.setinfo("mytask-info-2");
timer.schedule(mytask1, 1000, 2000); //任務1 一秒鐘後執行,每兩秒執行一次。
timer.scheduleatfixedrate(mytask2, 2000, 3000); //任務2 2秒後開始進行重複的固定速率執行(3秒鐘重複一次)
while (true){
//用來接收鍵盤輸入的字元串
byte[] info = new byte[1024];
int len = system.in.read(info);
string strinfo = new string(info, 0, len, "gbk");//從控制台讀出資訊
if (strinfo.charat(strinfo.length() - 1) == ' '){
strinfo = strinfo.substring(0, strinfo.length() - 2);
}
if (strinfo.startswith("cancel-1")){
mytask1.cancel();//退出任務1
// 其實應該在這裡判斷mytask2是否也退出了,是的話就應該break.但是因為無法在包外得到
// mytask2的狀态,是以,這裡不能做出是否退出循環的判斷.
} else if (strinfo.startswith("cancel-2")){
mytask2.cancel(); //退出任務2
} else if (strinfo.startswith("cancel-all")){
timer.cancel();//退出timer
break;
} else{
// 隻對mytask1作出判斷,偷個懶^_^
mytask1.setinfo(strinfo);
}
static class mytask extends java.util.timertask{
string info = "info";
@override
// todo auto-generated method stub
system.out.println(new date() + " " + info);
public string getinfo(){
return info;
public void setinfo(string info){
this.info = info;
}
此類建立了兩個定時任務mytask1和mytask2
mytask1任務和上面的timertest類中的例子用法一樣。即安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。
mytask2任務就不同于上面的用法了,timer.scheduleatfixedrate它是用的timer定時器的scheduleatfixedrate()方法來執行。
scheduleatfixedrate()方法在api1.6.0中是這樣定義的:
安排指定的任務在指定的時間開始進行重複的固定速率執行。以近似固定的時間間隔(由指定的周期分隔)進行後續執行。
近似固定的時間間隔的意思是說:在固定速率執行中,相對于已安排的初始執行時間來安排每次執行。如果由于任何原因(如垃圾回收或其他背景活動)而延遲了某次執行,則将快速連續地出現兩次或更多次執行,進而使後續執行能夠趕上來。
timer類的常用其他方法:
終止此計時器,丢棄所有目前已安排的任務。
從此計時器的任務隊列中移除所有已取消的任務。
安排在指定的時間執行指定的任務。
timertask類的常用其他方法:
取消此計時器任務。
此計時器任務要執行的操作。
傳回此任務最近實際 執行的已安排 執行時間。