Java Timer TimerTask 示例

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