Tutorial

Java Timer TimerTask Example

Published on August 3, 2022
author

Pankaj

Java Timer TimerTask Example

Java java.util.Timer is a utility class that can be used to schedule a thread to be executed at certain time in future. Java Timer class can be used to schedule a task to be run one-time or to be run at regular intervals.

Java TimerTask

java.util.TimerTask is an abstract class that implements Runnable interface and we need to extend this class to create our own TimerTask that can be scheduled using java Timer class.

Java Timer Example

java timer example, java timer, java timertask, java timertask example Java Timer class is thread safe and multiple threads can share a single Timer object without need for external synchronization. Timer class uses java.util.TaskQueue to add tasks at given regular interval and at any time there can be only one thread running the TimerTask, for example if you are creating a Timer to run every 10 seconds but single thread execution takes 20 seconds, then Timer object will keep adding tasks to the queue and as soon as one thread is finished, it will notify the queue and another thread will start executing. Java Timer class uses Object wait and notify methods to schedule the tasks. Here is a simple program for Java Timer and TimerTask example.

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 {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        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();
        }
    }

}

Notice that one thread execution will take 20 seconds but Java Timer object is scheduled to run the task every 10 seconds. Here is the output of the program:

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

The output confirms that if a task is already executing, Timer will wait for it to finish and once finished, it will start again the next task from the queue. Java Timer object can be created to run the associated tasks as a daemon thread. Timer cancel() method is used to terminate the timer and discard any scheduled tasks, however it doesn’t interfere with the currently executing task and let it finish. If the timer is run as daemon thread, whether we cancel it or not, it will terminate as soon as all the user threads are finished executing. Timer class contains several schedule() methods to schedule a task to run once at given date or after some delay. There are several scheduleAtFixedRate() methods to run a task periodically with certain interval. While scheduling tasks using Timer, you should make sure that time interval is more than normal thread execution, otherwise tasks queue size will keep growing and eventually task will be executing always. That’s all for a quick roundup on Java Timer and Java TimerTask.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Pankaj

author

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
November 6, 2020

Hi Pankaj, This may be a late question. My requirement is simple, I am going to execute a Java function, which I don’t know how long it will take to finish. Now I want to let this function run only for 30 min, irrespective it completion status. How it can be achieved.

- Ankit Sachan

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    May 28, 2020

    I would like to learn Discrete Event Simulation for Wireless Sensor Networks, any recommendation like books, websites or youtube channel… I prefer java programming language

    - Roger

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      January 8, 2020

      Hi Sir, Really nice example but for people who want to close things exactly without waiting the 30 seconds on the end rises some questions: Extended cases/questions: 1) What happens if we also write timerTask.cancel() after timer.cancel() ? I assume even the sixth TimerTask’s run won’t be executed until its end. 2) How to let run exactly only the first six TimerTask once all of the 12 went into the Timer queue? I have no idea 3) What happens if we simple leave the code out on the end with the waiting of 30000 millis? I assume the last current TimerTask will broken by java process end. Won’t it? 4) 5) 6) The same questions for each if we start the java process in the background?

      - Csaba

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        March 2, 2019

        hi, thanks for testing but I’ve got a question from you. I from Iran and I want to learn Java can you help me what work I should do?

        - kiyanoosh

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          October 24, 2018

          Hi, How can I queue the Task? e,g how can I only start the task if the very first time it executed successfully

          - Haroon

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            October 15, 2018

            how does the last line print after cancelling the timer???

            - inderjeet

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              May 22, 2018

              Notice that one thread execution will take 20 seconds but Java Timer object is scheduled to run the task every 10 seconds what is the reason for above line(why does it take 20 secs instead of 10)? please answer me

              - kesahv

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                March 12, 2018

                this content is really helpful. I got all information which i want thank you…

                - suhas

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  December 4, 2017

                  how to send email automatically every day in java

                  - rvanitha

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    January 28, 2017

                    Very informative and nice working example, although you probably should be using more robust scheduled executors available in java.util.concurrent from Java SE 5 as Concurrency utilities. See: 1) https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html ==> clearly says: “Java 5.0 introduced the java.util.concurrent package and one of the concurrency utilities therein is the ScheduledThreadPoolExecutor which is a thread pool for repeatedly executing tasks at a given rate or delay. It is effectively a more versatile replacement for the Timer/TimerTask combination, as it allows multiple service threads, accepts various time units, and doesn’t require subclassing TimerTask (just implement Runnable). Configuring ScheduledThreadPoolExecutor with one thread makes it equivalent to Timer. Implementation note: This class scales to large numbers of concurrently scheduled tasks (thousands should present no problem). Internally, it uses a binary heap to represent its task queue, so the cost to schedule a task is O(log n), where n is the number of concurrently scheduled tasks.” 2) https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long, long, java.util.concurrent.TimeUnit)

                    - Rui Carvalho

                      Try DigitalOcean for free

                      Click below to sign up and get $200 of credit to try our products over 60 days!

                      Sign up

                      Join the Tech Talk
                      Success! Thank you! Please check your email for further details.

                      Please complete your information!

                      Become a contributor for community

                      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                      DigitalOcean Documentation

                      Full documentation for every DigitalOcean product.

                      Resources for startups and SMBs

                      The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                      Get our newsletter

                      Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                      New accounts only. By submitting your email you agree to our Privacy Policy

                      The developer cloud

                      Scale up as you grow — whether you're running one virtual machine or ten thousand.

                      Get started for free

                      Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                      *This promotional offer applies to new accounts only.