مثال على مؤقت Java TimerTask

\begin{Arabic}
جافا java.util.Timer هو فئة أداة يمكن استخدامها لجدولة تنفيذ خيط في وقت معين في المستقبل. يمكن استخدام فئة Java Timer لجدولة مهمة لتشغيلها مرة واحدة أو لتشغيلها بفواصل زمنية منتظمة.

Java TimerTask

java.util.TimerTask هو فئة مجردة تنفذ واجهة Runnable ونحتاج إلى تمديد هذه الفئة لإنشاء TimerTask الخاص بنا يمكن جدولته باستخدام java Timer فئة.

مثال على Java Timer
\end{Arabic}

فئة Java Timer هي آمنة للمواضيع ويمكن لعدة مواضيع مشاركة كائن واحد من الفئة Timer دون الحاجة إلى تزامن خارجي. تستخدم فئة Timer java.util.TaskQueue لإضافة المهام بفاصل زمني منتظم محدد وفي أي وقت يمكن أن يكون هناك موضوع واحد فقط يعمل في المهمة الزمنية (TimerTask)، على سبيل المثال إذا كنت تقوم بإنشاء مؤقت لتشغيله كل 10 ثوانٍ ولكن تنفيذ الموضوع الواحد يستغرق 20 ثانية، فإن كائن Timer سيواصل إضافة المهام إلى الطابور وبمجرد انتهاء موضوع واحد، سيخطر الطابور وسيبدأ موضوع آخر التنفيذ. تستخدم فئة Java Timer أساليب 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 Timer مجدول لتشغيل المهمة كل 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() في المؤقت لإنهاء المؤقت وتجاهل أي مهام مجدولة ، ومع ذلك فإنها لا تتدخل في المهمة التي تنفذ حاليًا وتسمح لها بالانتهاء. إذا تم تشغيل المؤقت كخيط شيطاني ، سواء قمنا بإلغائه أم لا ، فسيتم إنهاؤه بمجرد الانتهاء من تنفيذ جميع خيوط المستخدم. يحتوي فئة المؤقت على العديد من طرق الجدولة() لجدولة مهمة لتشغيل مرة واحدة في تاريخ محدد أو بعد فترة تأخير معينة. هناك العديد من طرق scheduleAtFixedRate() لتشغيل مهمة بشكل دوري بفاصل زمني معين. أثناء جدولة المهام باستخدام المؤقت ، يجب التأكد من أن فترة الزمن أكبر من تنفيذ الخيط العادي ، وإلا فإن حجم طابور المهام سيستمر في الزيادة وفي النهاية ستتم تنفيذ المهمة دائمًا. هذا كل شيء لملخص سريع عن مؤقت جافا ومهمة المؤقت جافا.

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