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

這兩個類使用起來很是方便,能夠完成咱們對定時器的絕大多數需求

Timer類是用來執行任務的類,它接受一個TimerTask作參數

Timer有兩種執行任務的模式,最經常使用的是schedule,它能夠以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間以後(int delay).這兩種方式均可以指定任務執行的頻率java


TimerTest.java:ide

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("________");   
        }   
    }  
}

此類運行時:this

程序啓動1秒後在控制檯打印「————」spa

間隔兩秒後接着執行MyTask的run()方法,打印「————」code

這樣一直循環隊列

當在控制檯輸入s字符時,timer定時器取消工做字符串

跳出整個循環get

程序運行結束!string


TimerTest2.java:it

package com.cn;

import java.io.IOException;
import java.util.Date;
import java.util.Timer;

public class TimerTest2{   
	  
    public static void main(String[] args){   
        Timer timer = new Timer();   
        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){   
            try{   
            	//用來接收鍵盤輸入的字符串
                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);   
                }   
            } catch (IOException e){   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            }   
        }   
    }   
  
    static class MyTask extends java.util.TimerTask{   
        
    	String info = "INFO";
  
        @Override   
        public void run(){   
            // 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類的經常使用其餘方法:

cancel()
終止此計時器,丟棄全部當前已安排的任務。

purge()
今後計時器的任務隊列中移除全部已取消的任務。

schedule(TimerTask task, Date time)
安排在指定的時間執行指定的任務。


TimerTask類的經常使用其餘方法:

cancel()
取消此計時器任務。

run()
此計時器任務要執行的操做。

scheduledExecutionTime()
返回此任務最近實際 執行的已安排 執行時間。