AdSense

網頁

2020/9/11

Java Timer and TimerTask 簡單範例

Java TimerTimerTask簡單範例如下。

Java的Timer可用來在指定時間執行任務,也就是排程(schedule),並可設重複執行。

Timer如字面意思就是一個計時器,可設定要執行的時間和重複執行的間隔。被執行的任務則為TimerTask

要執行的任務繼承TimerTask類別並實作run()方法,內容為要執行的任務,例如下面的DemoTimerTask

DemoTaskTimer

package com.abc.demo.timer.task;

import java.time.LocalDateTime;
import java.util.TimerTask;

public class DemoTimerTask extends TimerTask {

    public void run() {
        System.out.println(Thread.currentThread().getName() + ":" + LocalDateTime.now().getSecond());
    }

}

main()中建立兩個Timer並呼叫schedule()方法來設定排程。simpleTimer只會在3秒後執行一次,repeatTimer會在3秒後開始執行,且每間隔1秒會重複執行。

Main

package com.abc.demo;

import com.abc.demo.timer.task.DemoTimerTask;

import java.util.Timer;

public class Main {

    public static void main(String[] arges) {

        long delay = 3000L; // 延遲開始執行的時間(毫秒),延遲3秒
        long period = 1000L; // 重複的時間(毫秒),間隔1秒

        Timer simpleTimer = new Timer();
        simpleTimer.schedule(new DemoTimerTask(), delay); // 只會執行一次

        Timer repeatTimer = new Timer();
        repeatTimer.schedule(new DemoTimerTask(), delay, period); // 會依設定的時間間隔重複執行

    }

}

執行結果如下

Timer-1:7
Timer-0:7
Timer-1:8
Timer-1:9
Timer-1:10
Timer-1:11

參考github


每一個Timer其實就是一個執行緒(thread),而TimerTask是執行緒要執行的Runnable實例。Timer是藉由成員TaskQueue來維護排程任務,任務則交由成員TimerThread來執行。

節錄原始碼如下。

Timer

public class Timer {
    ...
    private final TaskQueue queue = new TaskQueue();
    ...
    private final TimerThread thread = new TimerThread(queue);
    ...
}

class TaskQueue {
    
    private TimerTask[] queue = new TimerTask[128];

}

class TimerThread extends Thread {
    ...
    private TaskQueue queue;

    TimerThread(TaskQueue queue) {
        this.queue = queue;
    }

    public void run() {
        ...
    }
    ...
}

TimerTask

public abstract class TimerTask implements Runnable {
    ...
}


除了Java JDK提供的Timer外,其他的排程工具有Quartz排程框架、Spring框架的Spring Task。而Linux crontab則是系統級別的排程器。

沒有留言:

AdSense