Sunday, February 3, 2013

What is Timer and TimerTask in Java – Tutorial Example

Timer in Java is a utility class which is used to schedule tasks for both one time and repeated execution. Timer is similar to alarm facility many people use in mobile phone. Just like you can have one time alarm or repeated alarm, You can use java.util.Timer to schedule one time task or repeated task. In fact we can implement a Reminder utility using Timer in Java and that's what we are going to see in this example of Timer in Java. Two classes java.util.Timer and java.util.TimerTask is used to schedule jobs in Java and forms Timer API. TimerTask is actual task which is executed by Timer. Similar to Thread in Java, TimerTask also implements Runnable interface and overrides run method to specify task details. This Java tutorial will also highlight difference between Timer and TimerTask class and explains how Timer works in Java. By the way difference between Timer and Thread is also a popular Java questions on fresher level interviews.

What is Timer and TimerTask in Java

Timer and TimerTask example in Java Timer in Java is a utility class form java.util package which provides facility to schedule task at any time in future. As I said earlier, Timer is analogues to alarm clock you setup in your smartphone. Just like alarm can be either one time or recurring, You can also schedule task for one time and recurring time interval using Timer API. Timer provides method to schedule Task where task is instance of TimerTask class, which implements Runnable interface and overrides run() method to define task which is called on scheduled time.

How Timer works in Java

Timer class in Java maintains a background Thread (this could be either daemon thread or user thread, based on how you created your Timer object), also called as timer's task execution thread. For each Timer there would be corresponding task processing Thread which run scheduled task at specified time. If your Timer thread is not daemon then it will stop your application from exits until it completes all schedule task. Its recommended that TimerTask should not be very long otherwise it can keep this thread busy and not allow other scheduled task to get completed. This can delay execution of other scheduled task, which may queue up and execute in quick succession once offending task completed.

Difference between Timer and TimerTask in Java

I have seen programmers getting  confused between Timer and TimerTask, which is quite unnecessary because these two are altogether different. You just need to remember:

1) Timer in Java schedules and execute TimerTask which is an implementation of Runnable interface and overrides run method to defined actual task performed by that TimerTask.

2) Both Timer and TimerTask provides cancel() method. Timer's cancel() method cancels whole timer while TimerTask's one cancels only a particular task. I think this is the wroth noting difference between Timer and TimerTask in Java.

Canceling Timer in Java
You can cancel Java Timer by calling cancel() method of java.util.Timer class, this would result in following:
1) Timer will not cancel any currently executing task.
2) Timer will discard other scheduled task and will not execute them.
3) Once currently executing task will be finished, timer thread will terminate gracefully.
4) Calling Timer.cancel() more than one time will not affect. second call will be ignored.

In addition to cancelling Timer, You can also cancel individual TimerTask by using cancel() method of TimerTask itself.

Timer and TimerTask example to schedule Tasks
Here is one example of Timer and TimerTask in Java to implement Reminder utility.

public class JavaReminder {
    Timer timer;

    public JavaReminder(int seconds) {
        timer = new Timer();  //At this line a new Thread will be created
        timer.schedule(new RemindTask(), seconds*1000); //delay in milliseconds

    class RemindTask extends TimerTask {

        public void run() {
            System.out.println("ReminderTask is completed by Java timer");
            timer.cancel(); //Not necessary because we call System.exit
            //System.exit(0); //Stops the AWT thread (and everything else)

    public static void main(String args[]) {
        System.out.println("Java timer is about to start");
        JavaReminder reminderBeep = new JavaReminder(5);
        System.out.println("Remindertask is scheduled with Java timer.");

Java timer is about to start
Remindertask is scheduled with Java timer.
ReminderTask is completed by Java timer  //this will print after 5 seconds

Important points on Timer and TimerTask in Java
Now we know what is Timer and TimerTask in Java, How to use them, How to cancel then and got an understanding on How Timer works in Java. It’s good time to revise Timer and TimerTask.

1.One Thread will be created corresponding ot each Timer in Java, which could be either daemon or user thread.
2.You can schedule multiple TimerTask with one Timer.
3.You can schedule task for either one time execution or recurring execution.
4.TimerTask.cancel() cancels only that particular task, while Timer.cancel() cancel all task scheduled in Timer.
5.Timer in Java will throw IllegalStateException if you try to schedule task on a Timer which has been cancelled or whose Task execution Thread has been terminated.

That's all on what is Timer and TimerTask in Java and difference between Timer and TimerTask in Java. Good understanding of Timer API is required by Java programmer to take maximum advantage of scheduling feature provided by Timer. They are essential and can be used in variety of ways e.g. to periodically remove clean cache,  to perform timely job etc.

Other Java Multithreading Tutorials from Javarevisited Blog


garima said...

Hi Javin,
The program which you have provided here is for one time execution.
What are changes need to be done in program for recurring execution?

Jiri Pinkas said...

Timer is great. I used it a lot until I found this class:


From API: "This class is preferable to Timer when multiple worker threads are needed, or when the additional flexibility or capabilities of ThreadPoolExecutor (which this class extends) are required."

Javin @ ClassLoader in Java said...

@garima, You just need to use different schedule() method from Timer class. For recurring execution you can following schedule() method :

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

This will schedule task for repeated execution, first execution will be after delay specified by second argument and than subsequent recurring execution will be separated by period, third argument.

Javin @ xml interview questions said...

@Jiri Pinkas, Indeed ScheduledThreadPoolExecutor is good to know and as you said has a clear advantage when you need multiple worker thread.

Anonymous said...

Hi , Facing problem while using timers. I have scheduled job like the below. But its not triggerng when the time comes.

Timer timer = new Timer()
timer.schedule(new Timertask() {
pubil void run()

For the first time its getting triggered and for the next two times its not printing. and no erro is also thrown.

Is there a way to check the scheudle jobs list using the timer instance or any other way we could debug this.

Please help me

Anonymous said...

Hi Javin,
Nice Explanation, but I have question, how can it knows that the task is complete or not?

Anonymous said...

...As said, it is useful for short tasks and it's effective for more purpose but the presence of classic synchronization can be a problem in some stress condition. java.util.Timer it's also used in some old JBoss Server or JDBC Driver. It useful to have some standard classes (TimeTask is an Abstract Class to Extends) that define common Task and inside we can put simple logic to know what goes on and when (maybe we will find that over some level it's better another approach)
We need to put attention to have short task, when we use it, we need to cancel unused tasks, we need to purge cancelled tasks. Sometimes, we need to force some clean, playing on internal field with reflection: for example, knowning TimeThread, you can clean and shutdown a leaked Timer...

try {
final Field newTasksMayBeScheduled = ReflectionUtil.findField(thread.getClass(),"newTasksMayBeScheduled");
final Object queue = ReflectionUtil.findField(thread.getClass(), "queue").get(thread);
final Method clear = ReflectionUtil.getDeclaredMethod(queue,"clear");
synchronized (queue) {
queue.notify(); }}catch (Exception ex) {...}

Javin Paul said...

@Anonymous 1, There is no way to check if a Task is completed or not. You need to put your logic there e.g. when run() method is successfully executed you can set a boolean to indicate that job is successful. You can set it false in case of any exception.

Javin Paul said...

@Anonymous, Yes, cleanup is responsibility of developer here. I have seen cases of memory leak with hung TimerTask holding references of big objects.

Post a Comment