JAVA TIMER用法學習

JAVA TIMER用法學習

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

     Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data)2:在某個固定的時間之後(int delay).這兩種方式都可以指定任務執行的頻率.看個簡單的例子:



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

public class TimerTest ...{
       
    
public static void main(String[] args)...{

54com.cn


        Timer timer = 
new Timer();
        timer.schedule(
new MyTask(), 1000, 2000);//1秒後執行此任務,每次間隔2,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.
        
while(true)...{//這個是用來停止此任務的,否則就一直循環執行此任務了
            
try ...{
                
int ch = System.in.read();
                
if(ch-'c'==0)...{
                    timer.cancel();//
使用這個方法退出任務
                    
                }
            } 
catch (IOException e) ...{
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    
    
static class MyTask extends java.util.TimerTask...{
        @Override
        
public void run() ...{
            
// TODO Auto-generated method stub
            System.out.println("________");
        }
    }


    
    
    
    
}


    如果你使用的是JDK 5+,還有一個scheduleAtFixedRate模式可以用,在這個模式下,Timer會盡量的讓任務在一個固定的頻率下運行,舉例說明:在上面的例子中,我們想讓MyTask1秒鐘後,每兩秒鐘執行一次,但是因爲java不是實時的(其實java實時性很差.....),所以,我們在上個程序中表達的原義並不能夠嚴格執行.如果我們調用的是scheduleAtFixedRate,那麼,Timer會盡量讓你的Task執行的頻率保持在2秒一次.運行上面的程序,假設使用的是scheduleAtFixedRate,那麼下面的場景就是可能的:1秒鐘後,MyTask 執行一次,因爲系統繁忙,之後的2.5秒後MyTask 才得以執行第二次,然後,Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那麼,1.5秒後,MyTask 將執行的三次."以固定的頻率而不是固定的延遲時間去執行一個任務"

下面給出一個複雜點的例子,其中告訴大家怎麼退出單個TimerTask,怎麼退出所有Task

package MyTimerTest;

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




/**//* JavaScript之家http://www.jorse.cn
 * 
本類給出了使用TimerTimerTaske的主要方法,其中包括定製任務,添加任務
 * 
退出任務,退出定時器.
 * 
因爲TimerTaskstatus域是包級可訪問的,所以沒有辦法在java.util.包外
 * 
得到其狀態,這對編程造成一些不便 .我們不能判斷某個Task的狀態了.
 * 
 */


public class TimerTest ...{

    
public static void main(String[] args) ...{
        Timer timer = 
new Timer();
        MyTask myTask1 = 
new MyTask();
        MyTask myTask2 = 
new MyTask();
        myTask2.setInfo("myTask-2");
        timer.schedule(myTask1, 1000, 2000);
        timer.scheduleAtFixedRate(myTask2, 2000, 3000);
        
while (true...{

feedom.net


            
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();//退出單個任務
                    // 
其實應該在這裏判斷
myTask2是否也退出了,是的話就應該break.但是因爲無法在包外得到
                    // myTask2
的狀態,所以,這裏不能做出是否退出循環的判斷.
                } else if (strInfo.startsWith("Cancel-2")) ...{

feedom.net


                    myTask2.cancel();
                } 
else if (strInfo.startsWith("Cancel-All")) ...{

JavaScript之家http://www.jorse.cn


                    timer.cancel();
//退出Timer
                    break;
                } 
else ...{
                    
// 只對myTask1作出判斷,偷個懶^_^
                    myTask1.setInfo(strInfo);
                }
            } 
catch (IOException e) ...{                 // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

JavaScript之家http://www.jorse.cn
    }

    
static class MyTask extends java.util.TimerTask ...{

54com.cn


        String info = "^_^";

        @Override
        
public void run() ...{


            
// TODO Auto-generated method stub
            System.out.println(info);
        }

        
public String getInfo() ...{
            
return info;
        }

        
public void setInfo(String info) ...{


            
this.info = info;
        }

    }

}
JavaScript之家http://www.jorse.cn

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章