Java中Timer的用法

Java自帶的java.util.Timer類,經過調度一個java.util.TimerTask任務。這種方式可讓程序按照某一個頻度執行,但不能指定時間運行。用的較少。java

任務的調用經過起的子線程進行執行。ide

java.util.Timerspa

java.util.TimerTask
線程

1、調用方法:日誌

(1)void java.util.Timer.schedule(TimerTask task, long delay):多長時間(毫秒)後執行任務code

(2)void java.util.Timer.schedule(TimerTask task, Date time):設定某個時間執行任務orm

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay時間後開始執行任務,並每隔period時間調用任務一次。get

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime時間點執行任務,以後每隔period時間調用任務一次。it

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay時間後開始執行任務,並每隔period時間調用任務一次。io

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime時間點執行任務,以後每隔period時間調用任務一次。

void java.util.Timer.cancel():終止該Timer

boolean java.util.TimerTask.cancel():終止該TimerTask

能夠爲每一個Timer指定多個TimerTask


雖然可經過void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成「例如:天天上午10點執行一次」的業務,但該實現是基於進行一天(1000 * 60 * 60 * 24毫秒)進行延遲的機制實現的,並非指定某個具體時間進行執行的。

對於該種需求,可經過Quartz來進行實現


2、方法名稱schedule()和scheduleAtFixedRate()二者的區別

當須要根據period區間時間循環屢次調用任務的時候,會存在兩種不一樣的策略,兩種方法提供了不一樣的策略。

調用方法(1)、(2)只是單次執行,不存在屢次調用任務的狀況,因此沒有提供scheduleAtFixedRate方法的調用方式。

<1>schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次
<2>scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障屢次調用的頻率趨近於period時間,若是某一次調用時間大於period,下一次就會盡可能小於period,以保障頻率接近於period


3、示例

(1)

/** 
 * 第一種方法:設定多長時間(毫秒)後執行任務 
 */  
public static void timer1() {  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, long delay) */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            watch.stop();  
            System.out.println("-------任務執行--------");  
            System.out.println(watch.getTime());  
        }  
    }, 2000);// delay=2000毫秒 後執行該任務  
}

(2)

/** 
 * 第二種方法:設定某個時間執行任務 
 */  
public static void timer2() {  
    Calendar calendar = new GregorianCalendar();  
    calendar.add(Calendar.MINUTE, 1);  
    calendar.set(Calendar.SECOND, 0); // 一分鐘後執行  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, Date time) */  
    timer.schedule(new TimerTask() {  
        @Override  
        public void run() {  
            System.out.println("-------任務執行--------");  
        }  
    }, calendar.getTime());  
}

(3)

/** 
 * 第三種方法:設定指定任務task在指定延遲delay後進行固定延遲peroid的執行 
 */  
public static void timer3() {  
    Timer timer = new Timer();  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    System.out.println(Thread.currentThread().getName());  
    /* 
     * void java.util.Timer.schedule(TimerTask task, long delay, long 
     * period) 
     */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            /* 子線程進行任務的執行 */  
            System.out.println(Thread.currentThread().getName());  
            System.out.println("-------設定要指定任務--------");  
            watch.suspend();  
            System.out.println(watch.getTime());  
            watch.reset();  
            watch.start();  
        }  
    }, 1000, 1000);  
}

(4)

/** 
 * 固定延遲peroid時間後執行;peroid時間不是以任務執行完的時間爲計算起點(某次任務執行完成後,通過peroid時間後再次調用[不是這樣的])。 
 * 而是每隔peroid時間調用任務一次。當任務執行的時間小於peroid時間,能夠保證每隔peroid時間調用一次。 
 * 當任務的執行時間大於peroid時間時,從現象上看:任務一執行完,就會馬上進入下一次任務的執行 
 */  
public static void timer3a() {  
    Timer timer = new Timer();  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    timer.schedule(new TimerTask() {  
        Integer i = 1;  
        public void run() {  
            System.out.println(watch.getTime());  
            System.out.println("########第" + i + "次執行開始########");  
            try {  
                Thread.sleep(400);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("########第" + i + "次執行結束########");  
            i++;  
            watch.reset();  
            watch.start();  
        }  
    }, 1000, 500);  
}

period:500毫秒;每次任務執行時間400毫秒;因此每次任務執行完成後到下一次任務調用開始的時間趨近於100毫秒

打印日誌信息

  1. 1000  

  2. ########第1次執行開始########  

  3. ########第1次執行結束########  

  4. 109  

  5. ########第2次執行開始########  

  6. ########第2次執行結束########  

  7. 93  

  8. ########第3次執行開始########  

  9. ########第3次執行結束########  

  10. 93  

  11. ########第4次執行開始########  

  12. ########第4次執行結束########  

  13. 93  

  14. ########第5次執行開始########  

  15. ########第5次執行結束########  

  16. 93  

  17. ########第6次執行開始########  

  18. ########第6次執行結束########  

  19. 93  

  20. ########第7次執行開始########  

  21. ########第7次執行結束########  

  22. 93  

  23. ########第8次執行開始########  

當將Thread.sleep(400);修改成Thread.sleep(600)時:

打印日誌信息:

  1. 1000  

  2. ########第1次執行開始########  

  3. ########第1次執行結束########  

  4. 0  

  5. ########第2次執行開始########  

  6. ########第2次執行結束########  

  7. 0  

  8. ########第3次執行開始########  

  9. ########第3次執行結束########  

  10. 0  

  11. ########第4次執行開始########  

  12. ########第4次執行結束########  

  13. 0  

  14. ########第5次執行開始########  

(5)

/** 
 * 第四種方法:安排指定的任務task在指定的時間firstTime開始進行重複的固定速率period執行 
 * 天天中午12點都執行一次 
 */  
public static void timer4() {  
    Calendar calendar = Calendar.getInstance();  
    calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制時  
    calendar.set(Calendar.MINUTE, 0); // 控制分  
    calendar.set(Calendar.SECOND, 0); // 控制秒  
  
    Date time = calendar.getTime(); // 得出執行任務的時間,此處爲今天的12:00:00  
  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            System.out.println("-------設定要指定任務--------");  
        }  
    }, time, 1000 * 60 * 60 * 24);// 這裏設定將延時天天固定執行  
}


(6)

/** 
 * 第五種方法:設定指定任務task在指定延遲delay後進行固定頻率peroid的執行。 
 * timer.schedule和timer.scheduleAtFixedRate的區別: 
 * (1)schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次 
 * (2)scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障屢次調用的頻率趨近於period時間,若是某一次調用時間大於period,下一次就會盡可能小於period,以保障頻率接近於period 
 */  
public static void timer5() {  
    Timer timer = new Timer();  
    /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */  
    timer.scheduleAtFixedRate(new TimerTask() {  
        public void run() {  
            System.out.println("-------設定要指定任務--------");  
        }  
    }, 1000, 500);  
}
相關文章
相關標籤/搜索