آموزش کلاس های Timer و TimerTask در جاوا

کلاس های Timer و TimerTask در جاوا

کلاس های Timer و TimerTask در جاوا

از ویژگی های پکیج java.util توانایی زمانبندی کارها می باشد. در جاوا پکیج util با گنجاندن دو کلاس Timer و TimerTask ، امکان زمانبندی کارها را بسیار ساده کرده است و به شما این اجازه را می دهد که بدون درگیر شدن با مفاهیم MutliTasking  و    MultiThreading ، به سادگی یک عمل را در زمان تعین شده به صورت خودکار انجام دهید.

در اصل کار اصلی Timer و TimerTask در جاوا ایجاد یک Thread در پس زمینه است که منتظر است تا زمان تعین شده فرا برسد تا کار خاصی را که به او محول شده را انجام دهد. این دو کلاس امکانات متنوعی به شما می دهند تا بتوانید کار را برای اجرا در  زمانی مشخص و یا  اجرا به صورت پی در پی زمانبندی کنید.

کلاس های Timer و TimerTask با هم کار می کنند. Timer وظیفه زمانبندی کار را بر عهده دارد و TimerTask وظیفه انجام کار معین شده در هنگام فرا رسیدن زمان مشخص شده را بر عهده دارد. Timer با استفاده از نمونه ای از TimerTask کاری را در زمان مشخصی انجام می دهد. پس باید نمونه ای از TimerTask ایجاد کنیم و سپس آن را با ایجاد نمونه ای از Timer زمانبندی کنیم.

 

کلاس TimerTask:

این کلاس یک کلاس abstract می باشد که متد run()  را برای پیاده سازی توسط شما به صورت abstract تعریف کرده است. برای اینکه بتوانیم از این کلاس نمونه ای بسازیم مجبوریم که این متد را پیاده سازی کنیم. بهترین روش برای این کار ایجاد کلاسی است که از کلاس TimerTask مشتق می شود (ارث بری دارد) و متد run() را پیاده سازی می کند.

در زیر کلاسی  را می بینید که از کلاس TimerTask ارث بری کرده و متد run() را پیاده سازی می کند.

این کلاس یک Object از نوع String دریافت کرده و وظیفه دارد به در زمانی که کلاس Timer تعیین میکند متد run() را اجرا و String  و تعداد کلماتش را در خروجی چاپ کند.

import java.util.TimerTask;

class MyTimerTask extends TimerTask {

    private String str;

    public MyTimerTask(String str) {
        this.str = str;
    }

    public void run() {
        String words[] = str.split(" ");
        System.out.println("\n" + str);
        System.out.println("number of words: " + words.length);
    }
}

 

کلاس Timer :

پس از TimerTask که همان کار مورد نظر است که باید در زمان مشخص انجام شود، باید امور مربوط به زمانبندی کار را انجام دهیم. همانطور که گفته شد ، با استفاده از کلاس Timer این کار را انجام میدهیم.

کلاس Timer چهار نمونه constructor مختلف دارد که چون غیر از نوع اول ، سه نوع بعدی کاربرد خیلی کمتری دارند ، ما فقط به بررسی نوع اول می پردازیم.

public Timer()
public Timer(boolean isDaemon)
public Timer(String name)
public Timer(String name, boolean isDaemon)

برای زمانبندی کار ایجاد شده، باید یک Object از نوع Timer ایجاد کنیم و با استفاده از متد schedule تنظیمات مربوط به زمان بندی را اعمال کنیم.

متد schedule چهار نگارش مختلف دارد. که با هر کدام برای کار بخصوصی ایجاد شده اند.

public void schedule(TimerTask task, long delay)

این نسخه از متد schedule ، با گرفتن شی TimerTask  و زمان تاخیر( delay ) ، کار مورد نظر را بعد از انتظار به اندازه delay انجام میدهد.( delay زمانی بر حست میلی ثانیه است)

public void schedule(TimerTask task, Date time)

این نسخه از متد schedule با گرفتن شی TmerTask و یک شی از کلاس Date کاری را دقیقا در یک تاریخ  مشخص که این تاریخ در همین شی Date کپسوله شده است انجام می هد.

public void schedule(TimerTask task, long delay, long period)

این نسخه از متد schedule با گرفتن شی TmerTask علاوه بر انجام کار های نسخه اول، زمان تکرار کار را هم که با متغییر period  مشخص شده را بر حسب میلی ثانیه  می گیرد و بعد از تاخیر به اندازه delay ، بعد از گذشت زمان period ، کار مشخص شده در TimerTaks  را مدام تکرار می کند.

public void schedule(TimerTask task, Date firstTime, long period)

آخرین نسخه از متد schedule کاری مشابه نسخه سوم انجام می دهد با این تفاوت که زمان delay برای انتظار اولیه را در شی  Date دریافت می کند.

  • نکته: برای خاتمه دادن به زمانبندی باید با از متد cancel() استفاده کنیم. وگرنه Thread مربوط به این شی از بین نخواهد رفت. و برنامه همچنان باز خواهد ماند.

مثال

در زیر مثالی را می بینید که برای استفاده از کلاس Timer نوشته شده و با به خدمت گرفتن کلاس MyTimerTask ( که در بالا پیاده سازی این کلاس را دیدیم ) ، کاری را که در این کلاس تعریف کرده ایم را زمانبندی می کند. در این مثال با استفاده از نسخه سوم متد schedule ، کار تعیین شده در MyTimerTask  را بعد از  تاخیر اولیه ۵۰۰ میلی ثانیه ، و سپس تکرار کار در هر ۱۰۰۰ میلی ثانیه یکبار، اجرا میکنیم.و پس از گذشت ۵۰۰۰ میلی ثانیه cancel() را فراخوانی کرده و به کار Timer خاتمه می دهیم.

import java.util.Timer;

class Main {

    public static void main(String args[]) {
        String str = "hi. welcome to neo-one.ir. this lesson is Timer and TimerTask learning in java";
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(str), 500, 1000);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {}
        timer.cancel();
    }
}

 

لطفا سوالات خود در مورد این آموزش را در قسمت نظرات مطرح بفرمایید

موفق و سربلند باشید

امید فرجی

سلام، امید فرجی هستم از همدان. بیشتر از 7 سال میشه که در حوضه برنامه نویسی جاوا و اندروید فعالیت دارم و در این مدت پروژه های تجاری مختلفی انجام دادم. همچنین از سال 91 سایت آموزش تخصصی جاوا را راه اندازی کردم و در خدمت شما هستم. امیدوارم مفید بوده باشم. برای سفارش پروژه هاتون باهام تماس بگیرید.

شما ممکن است این را هم بپسندید

۱۹ پاسخ‌ها

  1. جاواکار گفت:

    لطفا به غلطهای املایی هم توجه بفرمایین:
    کتد، صانیه،

  2. m03tafa گفت:

    سلام اگر نخواهیم cancel شود برنامه با مشکل مواجه میشود؟ یعنی توو Loop میافته و کار نمیده؟

    • سلام.
      نه. اگه cancel نکنیم ، کار زمانبدی شده تا وقتی که برنامه در حال اجراس، ادامه پیدا میکنه.
      هر وقت که خواستیم زمانبندی تموم بشه cancel رو صدا میزنیم

    • سیاوش ابراهیمی گفت:

      با اجازه دوست خوبم امید ،
      با مشکل مواجه نمیشه ، ممکنه واسه مدتی برنامتون Hang کنه ، البته شما میتونید غیر از اون روشی که دوست عزیزمون گفتن بیاین نوع Thread و Daemon بزارین تا با خارج شدن برنامه Thread هم خارج بشه . یعنی نوعی وابستگی به Main Thread ایجاد کنید .

    • اجازه ما هم دست شماس آقای ابراهیی. ممنون از پاسختون

  3. سحر گفت:

    سلام میشه یه تایمر معکوس مثال بزنید در حالت فرمی
    یعنی باز دن باتن استارت از سه دقیقه برگرد به صفر
    از سایت عالیتون ممنونم

    • همونطور که گفتم باید با Thread ها کار کنید. در صورت داشتن مشکل در حین نوشتن برنامه من در خدمت شما هستم.
      البته از همین آموزش یعنی از کلاس Timer هم میشه استفاده کرد و یه تایمر معکوس ساخت.
      تنها نکته ی تایمر اینه که هر یک ثانیه مقدار عوض بشه. یعنی یه تاخیر یک ثانیه ای بین هر تغییر تایمر وجود داشته باشه.
      این تاخییر رو با استفاده از Thread میتونید ایجاد کنید.
      موفق باشید

  4. سحر گفت:

    از کمکتون ممنونم ،
    برنامه رو همونطور که گفتین نوشتم تایمرم کار میکنه
    ولی تو باتن استاپ کد stop()رو که از شی ای که از thread نیو کردم فراخوانی میکنم کار نمیکنه یعنی روی باتن استاپ که میزنم کار نمیکنه چرا؟؟؟؟؟

    • وقتی اجرای Thread قطع میشه ، که اجرای متد run تموم شده باشه.
      پس شما برای stop کردن Thread، باید کاری کنید که کار متد run به انتها برسه.
      مثلا جاش شرط حلقه whileی که در متد run نوشتید، یه متغییر boolean قرار بدید، و وقتی که خواستید Thread تموم بشه، این متغییر boolean رو برابر با false قرار بدید.
      اینجوری حلقه while شکسته میشه و در نتیجه متد run به انتها میرسه و در نهایت Threadتون stop میشه.

  5. سحر گفت:

    ممنون از راهنماییتون

    
    while(min>=1
    min--;
    sec=59;}
    print:min,sec;
    thread.sleep(1000
    while(sce=0
    sec--;
    print:sec;
    thread.sleep(1000
    

    تقریبا شبیه کدی که من نوشتم
    الان کجاش باید حرف شمارو اعمال کنم؟
    خودم امتحان کردم متوجه نشدم

  6. سحر گفت:

    سلام ببخشید یکم دیر شد من این کدرو به طور کامل نوشتم لطف کنید بگید برای stopاین تایمر در قسمت باتن stopچی بنویسم؟؟ مننون
    در قسمت باتن استارت:

    
    thread t=new thread(new runable(){
    override
    public void run(){
    while(min>=1){
    sec=59;
    jlable.settext(integer.tostring(min)+":"+integer.tostring(sec));
    while(min>=1){
    min--;
    sec=59;
    jlable.settext(integer.tostring(min)+":"+integer.tostring(sec))
    try{
    thread.sleep(1000);
    }
    catch (excption e){}
    while(sec>0){
    sec--;
    jlable.settext(integer.tostring(min)+":"+integer.tostring(sec))
    try{
    thread.sleep(1000);}
    catch(excption e)}
    });
    t.start();
    
    • سلام
      این کد رو کجا نوشتی؟ این ۱۰۰ تا خطای syntax داره. حالا فرض میکنیم درسته.
      باید توی رویداد دکمه stop مقدار min که شرط حلقه while هست رو بزرگتر از ۱ قرار بدی. اینطوری حلقه دیگه اجرا نمیشه و در نتیجه برنامه از متد run خارج میشع. خارج شدن از متد run باعث میشه که اجرای Thread متوقف بشه و تایمر دیگه کار نکنه.
      پس تنها کاری که باید بکنی اینه که شرط حلقه while رو نقض کنی.

  7. سحر گفت:

    سلام من به صورت فرمی دارم کار میکنم و یه jbutttonواسه شروع تایمرم از ابزار pattern
    رو صفحم ایجاد کردم واین کد رو داخل کلیک این دکمه نوشتم برنامه ام کاملا درست اجرا میشه

    • منظورم از کجا نوشتی اینه که توی کدوم IDE نوشتی که این همه خطا رو متوجه نشدی.
      به هر حال برای توقف تایمر باید از تمام حلقه های داخل متد run خارج بشی. تا در نهایت از خود متد run خارج بشی.

  8. محمد گفت:

    سلام ! ممنون از سایت فوق العادتون ! میبخشید میپرسم ولی میشه توضیح بدید من برای ایجاد delay تو اون بخش کد باید چیکار کنم !
    هدفم اینه که حرکت دکمه از کنار صفحه تا پیکسل ۱۰۰ ام قابل رویت باشه !
    کد نمونه : http://www.uplooder.net/cgi-bin/dl.cgi?key=a5d7663ffb19151a0d9605702974d50b

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *