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); } };
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.
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 ...
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.
A few errors in your code snippet:
Thread
class, which is not really good practiceTimer
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 counter
s 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 } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With