Java java.util.Timer 是一個實用類別,可以用來在未來的特定時間安排執行緒的工具。 Java Timer 類別可用於安排一次性任務或定期間隔執行的任務。
Java TimerTask
java.util.TimerTask 是一個抽象類別,實作了 Runnable 介面,我們需要擴展此類別以建立自己的TimerTask,並使用java Timer 類別進行排程。
Java Timer 範例
Java計時器類是線程安全的,多個線程可以共享一個計時器對象而無需外部同步。計時器類使用java.util.TaskQueue在給定的固定間隔添加任務,並且任何時候只能有一個線程運行計時器任務,例如如果您創建一個每10秒運行一次的計時器,但是單個線程執行需要20秒,那麼計時器對象將繼續向隊列添加任務,當一個線程完成時,它將通知隊列,另一個線程將開始執行。Java計時器類使用wait和notify方法來安排任務。這是一個簡單的Java計時器和計時器任務示例程序。
package com.journaldev.threads;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//假設任務需要20秒才能完成
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//將計時器任務設置為守護線程
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//過一段時間後取消計時器
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
請注意,一個線程的執行將需要20秒,但Java計時器對象被安排在每10秒運行一次任務。以下是程序的輸出:
TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012
輸出確認如果任務已在執行,計時器將等待其完成,一旦完成,它將再次啟動隊列中的下一個任務。 Java計時器對象可以被創建為執行相關任務的守護線程。 Timer cancel() 方法用於終止計時器並丟棄所有預定的任務,但不會干擾當前正在執行的任務,讓其完成。如果計時器以守護線程運行,無論是否取消,它將在所有用戶線程完成執行後立即終止。 Timer類包含多個schedule()方法,用於在指定日期運行一次性任務或在一些延遲後運行。有幾種scheduleAtFixedRate()方法以特定間隔定期運行任務。在使用計時器安排任務時,應確保時間間隔大於正常線程執行時間,否則任務隊列大小將不斷增長,最終任務將一直執行。這就是有關Java計時器和Java TimerTask的快速總結。
Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example