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則是系統級別的排程器。
沒有留言:
張貼留言