Java Timer و TimerTask و Reminder Class تعليمي مع مثال
نشرت: 2021-02-04
java.util.Timer
هي فئة أدوات يمكن استخدامها لجدولة موضوع ليتم تنفيذه في وقت معين في المستقبل. يمكن استخدام فئة Java Timer لجدولة مهمة ليتم تشغيلها مرة واحدة أو ليتم تشغيلها على فترات منتظمة.
java.util.TimerTask
هي فئة مجردة تنفذ واجهة Runnable ونحتاج إلى توسيع هذه الفئة لإنشاء TimerTask الخاص بنا والذي يمكن جدولته باستخدام فئة java Timer .
فئة الموقت هي مؤشر ترابط آمن ويمكن للخيوط المتعددة مشاركة كائن مؤقت واحد دون الحاجة إلى مزامنة خارجية. تستخدم فئة المؤقت java.util.TaskQueue لإضافة مهام في فترة زمنية محددة وفي أي وقت يمكن أن يكون هناك مؤشر ترابط واحد فقط يقوم بتشغيل TimerTask ، على سبيل المثال إذا كنت تقوم بإنشاء Timer للتشغيل كل 10 ثوانٍ ولكن تنفيذ سلسلة واحدة يستغرق 20 ثانية ، ثم سيواصل كائن Timer إضافة المهام إلى قائمة الانتظار وبمجرد الانتهاء من مؤشر ترابط واحد ، فإنه سيبلغ قائمة الانتظار وسيبدأ مؤشر ترابط آخر في التنفيذ.

تستخدم فئة المؤقت أساليب انتظار الكائن وإخطارها لجدولة المهام. TimerTask هي abstract class
ونحن نرثها لتوفير تنفيذ ملموس. implements
فئة Runnable
interface
Runnable ، لذا فهي عبارة عن مؤشر ترابط ، وبالتالي فإن تطبيقك لـ TimerTask هو أيضًا مؤشر ترابط.
مثال على Timer و TimerTask بسيط للغاية: يتم تنفيذ المهمة بمجرد 5 seconds
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com . crunchify . tutorials ; import java . util . Timer ; import java . util . TimerTask ; /** * Author: Crunchify.com */ public class CrunchifyTimerTaskExample { Timer timer ; public CrunchifyTimerTaskExample ( int seconds ) { timer = new Timer ( ) ; timer . schedule ( new CrunchifyReminder ( ) , seconds * 1000 ) ; } class CrunchifyReminder extends TimerTask { public void run ( ) { System . out . format ( "Timer Task Finished..!%n" ) ; timer . cancel ( ) ; // Terminate the timer thread } } public static void main ( String args [ ] ) { new CrunchifyTimerTaskExample ( 5 ) ; System . out . format ( "Task scheduled.. Now wait for 5 sec to see next message..%n" ) ; } } |
نتيجة:
1 2 |
Task scheduled . . Now wait for 5 sec to see next message . . Time ' s up ! |
يوضح هذا البرنامج البسيط الأجزاء الأساسية التالية لتنفيذ وجدولة مهمة ليتم تنفيذها بواسطة مؤشر ترابط مؤقت:
- قم بتطبيق فئة فرعية مخصصة لـ
TimerTask
. يحتوي أسلوبrun
على التعليمات البرمجية التي تقوم بتنفيذ المهمة. في هذا المثال ، تم تسمية الفئة الفرعية CrunchifyReminder. - قم بإنشاء مؤشر ترابط عن طريق إنشاء مثيل لفئة
Timer
. - إنشاء كائن
TimerTask
(new CrunchifyReminder()
). - جدولة مهمة المؤقت للتنفيذ.
كيف يمكنني تنفيذ TimerTask بشكل متكرر؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package crunchify . com . tutorials ; import java . util . Timer ; import java . util . TimerTask ; import java . awt . Toolkit ; /** * Author: Crunchify.com * Java Timer and TimerTask - Reminder Class Tutorials */ public class CrunchifyTimerTaskExample { // Toolkit This class is the abstract superclass of all actual implementations of the Abstract Window Toolkit. // Subclasses of the Toolkit class are used to bind the various components to particular native toolkit implementations. Toolkit toolkit ; // Timer A facility for threads to schedule tasks for future execution in a background thread. // Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals. Timer timer ; public CrunchifyTimerTaskExample ( ) { toolkit = Toolkit . getDefaultToolkit ( ) ; timer = new Timer ( ) ; // schedule() Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. // Subsequent executions take place at approximately regular intervals separated by the specified period. timer . schedule ( new CrunchifyReminder ( ) , 0 , // initial delay 1 * 1000 ) ; // subsequent rate } // TimerTask A task that can be scheduled for one-time or repeated execution by a Timer. // A timer task is not reusable. Once a task has been scheduled for execution on a Timer or cancelled, // subsequent attempts to schedule it for execution will throw IllegalStateException. class CrunchifyReminder extends TimerTask { int loop = 5 ; public void run ( ) { if ( loop > 0 ) { // beep() Emits an audio beep depending on native system settings and hardware capabilities. toolkit . beep ( ) ; System . out . format ( "Knock Knock..!\n" ) ; loop -- ; } else { toolkit . beep ( ) ; System . out . format ( "\nThat's it.. Done..!" ) ; // cancel() Terminates this timer, discarding any currently scheduled tasks. Does not interfere with a currently executing task (if it exists). Once a timer has been terminated, // its execution thread terminates gracefully, and no more tasks may be scheduled on it. timer . cancel ( ) ; } } } public static void main ( String args [ ] ) { new CrunchifyTimerTaskExample ( ) ; System . out . format ( "Task scheduled..!%n \n" ) ; } } |
نتيجة:
1 2 3 4 5 6 7 8 9 |
Task scheduled . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! That ' s it . . Done . . ! |
بشكل افتراضي ، يستمر البرنامج في العمل طالما أن مؤشرات ترابط المؤقت الخاصة به تعمل. يمكنك إنهاء سلسلة عداد بأربع طرق:

- استدعاء
cancel
على جهاز ضبط الوقت. يمكنك القيام بذلك من أي مكان في البرنامج ، مثل طريقةrun
مهمة المؤقت. - اجعل خيط المؤقت "خفيًا" من خلال إنشاء المؤقت مثل هذا:
new Timer(true)
. إذا كانت المواضيع الوحيدة المتبقية في البرنامج هي خيوط الخفي ، فسيتم إنهاء البرنامج. - بعد الانتهاء من تنفيذ جميع المهام المجدولة لجهاز ضبط الوقت ، قم بإزالة كافة المراجع إلى كائن
Timer
. في النهاية ، سينتهي مؤشر ترابط جهاز ضبط الوقت. - قم باستدعاء طريقة
System.exit
، والتي تجعل البرنامج بأكمله (وجميع خيوطه) يخرج.