1. 程式人生 > >java定時器Timer的使用

java定時器Timer的使用

1、構造方法

Timer timer = new Timer();

②定時器為守護程序

boolean flag=true;

Timer timer1 =new Timer(flag);

③指定定時器的名字,方便指定停止 

String name="TimerName2";

Timer timer2 =new Timer(name);

④指定定時器的名字,並指定為守護程序 

String name3="TimerName3";

Timer timer3 =new Timer(name3, flag);

2、方法

①延時delay時間後執行task

public void schedule(
TimerTask
 task,long delay)
②指定時間執行task
public void schedule(TimerTask task,Date time)

③period:間隔週期  delay:執行延時週期 開始delay時間後間隔period執行task

public void schedule(TimerTask task, long delay,long period)

④間隔period時間,在指定firstTime時間執行

public void schedule(TimerTask task,Date firstTime,long period)
period:間隔週期  delay:執行延時週期 開始
delay時間後間隔period執行task
public void scheduleAtFixedRate(TimerTask task,long delay,long period)
間隔period時間,在指定firstTime時間執行

public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 

⑦定時器停止執行

public void cancel()
從這個計時器的任務佇列中移除所有已取消的任務。
public int purge()
3、example
package com.assp.admin.web.controller;


import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class JobTestController extends TimerTask {


    String jobName = "";


    public JobTestController(String jobName) {
        this.jobName = jobName;
    }
    @Override
    public void run() {
        System.out.println("go::::" + jobName);
    }
    public static void main(String[] args) {
        Date t=new Date();
        long tl=t.getTime();
        Timer timer = new Timer();
        
        boolean flag=true;
        Timer timer1 =new Timer(flag);
        
        String name="TimerName2";
        Timer timer2 =new Timer(name);
        
        String name3="TimerName3";
        Timer timer3 =new Timer(name3, flag);
        
        long delay1 = 1 * 1000;
        long period1 = 1000;
        // period1:間隔週期  delay1:執行延時週期 
        //從現在開始 1 秒鐘之後,每隔 1 秒鐘執行一次 job1
        timer.schedule(new JobTestController("job1"), delay1, period1);
        long delay2 = 2 * 1000;
        long period2 = 2000;
        // 從現在開始 2 秒鐘之後,每隔 2 秒鐘執行一次 job2
        timer.schedule(new JobTestController("job2"), delay2, period2);
        timer1.schedule(new JobTestController("timer1"), delay2, period2);
        //timer2.schedule(new JobTestController("timer2"), delay2, period2);
        //timer3.schedule(new JobTestController("timer3"), delay2, period2);
        timer1.cancel();        
    }
}
4、schedule與scheduleAtFixedRate區別
public static void main(String[] args) {
        Timer timer = new Timer();
        SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date d1 = null;
        try {
            d1 = fTime.parse("2016/09/02 17:12:00");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.out.println("this is task you do6");
            }
        }, d1, 3 * 60 * 1000);
}

上面例子間隔時間是3分鐘,指定開始時間是2006/09/02 14:10:00,如果我在14:17:00分執行這個程式,會立刻列印3次

  this is task you do6     //14:10

  this is task you do6     //14:13

  this is task you do6     //14:16

如果用schedule方法,相同引數條件下,在14:17:00執行,則立即執行一次,且下次的執行時間是14:20:00,而不是14:19:00

需要注意:scheduleAtFixedRate和schedule在引數完全相同的情況下,執行效果不同。上面是簡單的例子,在實際的專案中,定時任務比較複雜,由於某種原因(如垃圾回

收或者其他後臺活動)延遲了某次的執行,則scheduleAtFixedRate方法將快速連續的出現兩次或更多的執行,從而使後續執行能力追趕上來;而schedule方法的後續執行也

將被延遲。所以,在長期的執行中,scheduleAtFixedRate執行的頻率將整好是指定週期的倒數,schedule執行的頻率一般要稍慢於指定週期倒數。

結論:scheduleAtFixedRate 效率總體上高於schedule

4、總結

Timer 的優點:簡單易用

Timer 的缺點:

①. Timer是基於絕對時間的。容易受系統時鐘的影響。 
②. 單執行緒。所有TimeTask可能會相關影響 
③. Timer不會捕獲TimerTask的異常,只是簡單地停止。這樣勢必會影響其他TimeTask的執行。

Timer 實現任務排程的核心類:Timer 和 TimerTask。 Timer 負責設定 TimerTask 的起始與間隔執行時間。

Timer 的設計核心: TaskList 、TaskThread。Timer 將接收到的任務丟到自己的 TaskList 中,TaskList 按照 Task 的最初執行時間進行排序。TimerThread 在建立Timer時會啟動成為一個守護執行緒。這個執行緒會輪詢所有任務,找到一個最近要執行的任務,然後休眠,當到達最近要執行任務的開始時間點,TimerThread 被喚醒並執行該任務。之後 TimerThread 更新最近一個要執行的任務,繼續休眠

Timer 使用:使用者只需要建立一個 TimerTask 的繼承類,實現自己的 run 方法,然後將其丟給 Timer 去執行即可。