Java java.util.Timer is een hulpprogrammaklasse die kan worden gebruikt om een thread te plannen om op een bepaald tijdstip in de toekomst te worden uitgevoerd. De Java Timer-klasse kan worden gebruikt om een taak eenmalig uit te voeren of op regelmatige tussenpozen uit te voeren.
Java TimerTask
java.util.TimerTask is een abstracte klasse die de Runnable-interface implementeert, en we moeten deze klasse uitbreiden om onze eigen TimerTask te maken die kan worden gepland met behulp van de java Timer-klasse.
Java Timer Voorbeeld
De Java Timer-klasse is thread-safe en meerdere threads kunnen een enkel Timer-object delen zonder de noodzaak van externe synchronisatie. De Timer-klasse gebruikt java.util.TaskQueue om taken op regelmatige intervallen toe te voegen, en op elk moment kan er slechts één thread de TimerTask uitvoeren. Bijvoorbeeld, als je een Timer maakt om elke 10 seconden uit te voeren, maar de uitvoering van een enkele thread duurt 20 seconden, zal het Timer-object taken blijven toevoegen aan de wachtrij. Zodra een thread klaar is, zal het de wachtrij op de hoogte stellen, en een andere thread zal beginnen met uitvoeren. De Java Timer-klasse gebruikt de Object wait en notify-methoden om de taken te plannen. Hier is een eenvoudig programma voor een Java Timer en TimerTask-voorbeeld.
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 {
// ervan uitgaande dat het 20 seconden duurt om de taak te voltooien
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
// timer taak uitvoeren als daemon thread
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
// annuleren na enige tijd
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();
}
}
}
Let op dat de uitvoering van één thread 20 seconden zal duren, maar het Java Timer-object is gepland om de taak elke 10 seconden uit te voeren. Hier is de uitvoer van het programma:
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
De uitvoer bevestigt dat als een taak al wordt uitgevoerd, de Timer zal wachten tot deze is voltooid en vervolgens de volgende taak uit de wachtrij zal starten. Een Java Timer-object kan worden gemaakt om de bijbehorende taken als een daemon-thread uit te voeren. De `cancel()` methode van Timer wordt gebruikt om de timer te beëindigen en alle geplande taken te verwerpen, maar het heeft geen invloed op de momenteel uitgevoerde taak en laat deze voltooien. Als de timer wordt uitgevoerd als een daemon-thread, zal deze, ongeacht of we deze annuleren of niet, worden beëindigd zodra alle gebruikersthreads klaar zijn met uitvoeren. De Timer-klasse bevat verschillende schedule() methoden om een taak eenmaal op een bepaalde datum uit te voeren of na enige vertraging. Er zijn verschillende scheduleAtFixedRate() methoden om een taak periodiek uit te voeren met een bepaald interval. Bij het plannen van taken met de Timer, moet je ervoor zorgen dat het tijdsinterval langer is dan de normale thread-uitvoering, anders blijft de takenwachtrij groeien en zal de taak uiteindelijk constant worden uitgevoerd. Dat is alles voor een snelle samenvatting van Java Timer en Java TimerTask.
Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example