天天看點

Java 中Timer和TimerTask 定時器和定時任務使用的例子

這兩個類使用起來非常友善,可以完成我們對定時器的絕大多數需求 

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類的常用其他方法:

取消此計時器任務。

此計時器任務要執行的操作。

傳回此任務最近實際 執行的已安排 執行時間。