1. 程式人生 > >Java 中Timer和TimerTask 定時器和定時任務使用的例子

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:

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


終止此計時器,丟棄所有當前已安排的任務。

purge()
從此計時器的任務佇列中移除所有已取消的任務。


安排在指定的時間執行指定的任務。

TimerTask類的常用其他方法:


取消此計時器任務。

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