Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Timer in Java Thread

Tags:

I have a thread which is in charge of doing some processes. I want make it so that these processing would be done every 3 seconds. I've used the code below but when the thread starts, nothing happens. I assumed that when I define a task for my timer it automatically execute the ScheduledTask within time interval but it doesn't do anything at all. What am I missing?

class temperatureUp extends Thread  {     @Override     public void run()     {     TimerTask increaseTemperature = new TimerTask(){          public void run() {         try {             //do the processing          } catch (InterruptedException ex) {}         }     };      Timer increaserTimer = new Timer("MyTimer");     increaserTimer.schedule(increaseTemperature, 3000);      } }; 
like image 724
Afflatus Avatar asked Jul 29 '12 06:07

Afflatus


People also ask

What is Timer thread in Java?

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.

What is a Timer thread?

Timer Object. The Timer is a subclass of Thread. Timer class represents an action that should be run only after a certain amount of time has passed. A Timer starts its work after a delay, and can be canceled at any point within that delay time period. Timers are started, as with threads, by calling their start() method ...

How do you make a Timer thread?

Make the timer's thread a "daemon" by creating the timer like this: new Timer(true) . If the only threads left in the program are daemon threads, the program exits. After all the timer's scheduled tasks have finished executing, remove all references to the Timer object. Eventually, the timer's thread will terminate.


1 Answers

A few errors in your code snippet:

  • You extend the Thread class, which is not really good practice
  • You have a Timer within a Thread? That doesnt make sense as the a Timer runs on its own Thread.

You should rather (when/where necessary), implement a Runnable see here for a short example, however I cannot see the need for both a Thread and Timer in the snippet you gave.

Please see the below example of a working Timer which will simply increment the counter by one each time it is called (every 3seconds):

import java.util.Timer; import java.util.TimerTask;  public class Test {      static int counter = 0;      public static void main(String[] args) {          TimerTask timerTask = new TimerTask() {              @Override             public void run() {                 System.out.println("TimerTask executing counter is: " + counter);                 counter++;//increments the counter             }         };          Timer timer = new Timer("MyTimer");//create a new Timer          timer.scheduleAtFixedRate(timerTask, 30, 3000);//this line starts the timer at the same time its executed     } } 

Addendum:

I did a short example of incorporating a Thread into the mix. So now the TimerTask will merely increment counter by 1 every 3 seconds, and the Thread will display counters value sleeping for 1 seconds every time it checks counter (it will terminate itself and the timer after counter==3):

import java.util.Timer; import java.util.TimerTask;  public class Test {      static int counter = 0;     static Timer timer;      public static void main(String[] args) {          //create timer task to increment counter         TimerTask timerTask = new TimerTask() {              @Override             public void run() {                 // System.out.println("TimerTask executing counter is: " + counter);                 counter++;             }         };          //create thread to print counter value         Thread t = new Thread(new Runnable() {              @Override             public void run() {                 while (true) {                     try {                         System.out.println("Thread reading counter is: " + counter);                         if (counter == 3) {                             System.out.println("Counter has reached 3 now will terminate");                             timer.cancel();//end the timer                             break;//end this loop                         }                         Thread.sleep(1000);                     } catch (InterruptedException ex) {                         ex.printStackTrace();                     }                 }             }         });          timer = new Timer("MyTimer");//create a new timer         timer.scheduleAtFixedRate(timerTask, 30, 3000);//start timer in 30ms to increment  counter          t.start();//start thread to display counter     } } 
like image 71
David Kroukamp Avatar answered Sep 23 '22 22:09

David Kroukamp