天天看點

Java多線程詳解(十)------ 定時器

文章目錄

      • 1 定時器Timer的使用
        • 1.1 schedule(TimerTask task, Date time)
        • 1.2 schedule(TimerTask task, Date firstTime, long period)
        • 1.3 schedule(TimerTask task, long delay)
        • 1.4 schedule(TimerTask task, long delay, long period)
        • 1.5 具有追趕特性的scheduleAtFixedRate

1 定時器Timer的使用

Timer

類的主要作用就是設定計劃任務,但封裝任務的類卻是

TimerTask

類。

1.1 schedule(TimerTask task, Date time)

在指定的日期執行一次某一任務。

  1. 執行任務的時間晚于目前時間——在未來執行
public class Test1 {
    public static void main(String[] args) {
        System.out.println("now the time is: " + new Date());
        Calendar calendarRef = Calendar.getInstance();
        calendarRef.add(Calendar.SECOND, 10);
        Date runDate = calendarRef.getTime();
        MyTask myTask = new MyTask();
        Timer timer = new Timer();
        timer.schedule(myTask, runDate);
    }
}

class MyTask extends TimerTask {
    @Override
    public void run() {
        System.out.println("start executing job at " + new Date());
    }
}
           

上例中任務執行完畢後,程序還未銷毀,可以看到編輯器呈紅色狀态。

public Timer() {
    this("Timer-" + serialNumber());
}
public Timer(String name) {
    thread.setName(name);
    thread.start();
}
           

建立一個

Timer

就是啟動1個新的線程,那麼這個新啟動的線程并不是守護線程,一直在運作。

  1. 計劃早于目前時間——提前運作,啟動時立即執行任務
  2. Timer中允許有多個TimerTask任務

TimerTask

是以隊列的方式一個一個順序地執行,是以執行的時間有可能和預期的時間不一緻,因為前面的任務有可能消耗的時間較長,則後面的任務運作的時間也被延後。

1.2 schedule(TimerTask task, Date firstTime, long period)

在指定的日期之後按指定的間隔周期,無限循環地執行某一任務。

  1. 計劃時間晚于目前時間——在未來執行
  2. 計劃時間早于目前時間——提前運作
  3. 任務執行時間被延時——依延時時間定
  4. TimerTask

    類的

    cancel()

    方法:将自身從任務隊列中進行清除
  5. Timer

    類的

    cancel()

    方法:将任務隊列中全部的任務清空
  6. Timer

    cancel()

    方法注意事項:有時并不一定會停止計劃任務,而是正常執行。原因是

    Timer

    類中的

    cancel()

    方法有時并沒有争搶到

    queue

    鎖,則讓

    TimerTask

    類中的任務正常執行。

1.3 schedule(TimerTask task, long delay)

以目前的時間為參考時間,在此時間基礎上延遲指定的毫秒數後執行一次

TimerTask

任務

1.4 schedule(TimerTask task, long delay, long period)

以目前的時間為參考時間,在此時間基礎上延遲指定的毫秒數後執行一次

TimerTask

任務,再以某一間隔時間無限次數地執行某一任務。

1.5 具有追趕特性的scheduleAtFixedRate

方法

schedule

和方法

scheduleAtFixedRate

都會按順序執行,是以不需要考慮非線程安全的問題,兩者的主要差別隻在于有沒有追趕特性。

public class TimerTest9 {
    public static void main(String[] args) {
        MyTask myTask = new MyTask();
        System.out.println("start executing time:" + new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 20);
        Date runDate = calendar.getTime();
        System.out.println("expect to execute time:" + runDate);
        Timer timer = new Timer();
        timer.schedule(myTask, runDate, 2000);
        // timer.scheduleAtFixedRate(myTask, runDate, 2000);
    }

    static class MyTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("begin timer=" + new Date());
            System.out.println("  end timer=" + new Date());
        }
    }
}
           
schedule執行結果:
start executing time:Sat Dec 19 15:55:59 CST 2020
expect to execute time:Sat Dec 19 15:55:39 CST 2020
begin timer=Sat Dec 19 15:55:59 CST 2020
  end timer=Sat Dec 19 15:55:59 CST 2020
begin timer=Sat Dec 19 15:56:01 CST 2020
  end timer=Sat Dec 19 15:56:01 CST 2020
begin timer=Sat Dec 19 15:56:03 CST 2020

scheduleAtFixedRate執行結果:
start executing time:Sat Dec 19 16:05:16 CST 2020
expect to execute time:Sat Dec 19 16:04:56 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:16 CST 2020
  end timer=Sat Dec 19 16:05:16 CST 2020
begin timer=Sat Dec 19 16:05:18 CST 2020
  end timer=Sat Dec 19 16:05:18 CST 2020
           

追趕特性:将兩個時間段内的時間所對應的任務“補充性”地執行。Sat Dec 19 16:04:56 CST 2020 ~ Sat Dec 19 16:05:16 CST 2020