דוגמה לשעון ולמשימת שעון ב-Java

Java java.util.Timer הוא מחלקת ייעוד שניתן להשתמש בה לתזמן לשלב להרץ בזמן מסוים בעתיד. מחלקת Java Timer ניתן להשתמש בה לתזמן משימה להפעלה חד-פעמית או להפעיל בין פרקי זמן קבועים.

Java TimerTask

java.util.TimerTask הוא מחלקה מופשטת המממשת את ממשק ה-Runnable ואנו צריכים להרחיב ממנה כדי ליצור את המשימה האישית שלנו TimerTask שניתן לתזמן באמצעות מחלקת java Timer.

דוגמא ל-Java Timer

רמת הזמן של Java היא בטוחה וכמה תהליכים יכולים לשתף אובייקט יחיד של Timer בלי צורך בסנכרון חיצוני. רמת הזמן משתמשת ב-java.util.TaskQueue כדי להוסיף משימות בפריקות קבועות נתונות ובכל זמן נתון יכול להיות רק תהליך אחד רץ של TimerTask, לדוגמה אם אתה יוצר רמת הזמן כדי לרוץ כל 10 שניות אך ביצוע של תהליך יחיד מקבל 20 שניות, אז אובייקט הרמה ימשיך להוסיף משימות לתור וכשתהליך אחד יסתיים, הוא יודיע לתור ותהליך אחר יתחיל לבצע. רמת הזמן של Java משתמשת בשיטות wait ו-notify של Object כדי לתזמן את המשימות. הנה תוכנית פשוטה עבור דוגמת Java Timer ו- TimerTask.

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

הפלט מאשר כי אם משימה כבר מבוצעת, הטיימר ימתין שהיא תסתיים ואז יתחיל שוב את המשימה הבאה מתוך התור. אובייקט טיימר של ג'אווה יכול להיות נוצר כדי להריץ את המשימות המשויכות כאשר תהליך דאימון. שיטת cancel() של הטיימר משמשת לסיום הטיימר ולביטול כל משימות שמתוזמנות, אך היא לא מתערבת עם המשימה הפעילה כרגע ומאפשרת לה לסיים. אם הטיימר פועל כ תהליך רקע, בין שנבטל אותו או לא, הוא יסתיים מיד כשכל תהליכי המשתמש יסיימו את הביצוע. מחלקת הטיימר מכילה מספר שיטות schedule() כדי לתזמן משימה להרצה חד פעמית בתאריך נתון או לאחר זמן מסוים. קיימות מספר שיטות scheduleAtFixedRate() כדי להריץ משימה באופן תקופתי עם מרווח זמן מסוים. בעת תזמון משימות באמצעות הטיימר, עליך לוודא שמרווח הזמן גדול מביצוע התהליך הרגיל, אחרת גודל תור המשימות יתרום ולבסוף המשימה תמשך להיבצע תמיד. זהו הכול לסיכום מהיר על טיימר ג'אווה וטיימרטסק ג'אווה.

Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example