1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| package testtimer;
import java.util.Timer;
import java.util.TimerTask;
public class TimerPersoObjet {
private final static long HOUR = 60 * 60 * 1000;
private final static long MIN = 60 * 1000;
private final static long SEC = 1000;
public static void main(String[] args) {
// final long startDelay = 2 * HOUR; //120 min
final long startDelay = 20 * SEC; // 20 sec pour tester
// Déclaration d'un timerTask pour mettre à jour l'affichage de toutes les secondes
final TimerTask countingDownTask = new TimerTask() {
private final static long HOUR = 60 * 60 * 1000; // Variable Hour (heure en milliseconde)
private final static long MIN = 60 * 1000; // Variable Min (minute en milliseconde)
private final static long SEC = 1000; // Variable Sec (seconde en milliseconde)
long targetTime; // Variable targetTime pour stocker le delay du décompte
final StringBuilder sb = new StringBuilder("X h XX m XX s".length()); // Variable contenant un objet StringBuilder pour les chaines de caractère mutable (qui se transforme), destiné à ...
@Override
// Fonction qui exécute le pourquoi de la tâche
public void run() {
// ce code s'exécute toutes les secondes... (voir scheduleAtFixedRate plus loin)
if ( targetTime==0 ) {
// la première fois (il y aura un petit décalage dû au temps d'exécution du timer.schedule(mainTask), qu'on peut minimiser en faisant des classes non anonyme
// avec une communication entre les deux, mais ce temps d'exécution devrait être quand même négligeable
targetTime = System.currentTimeMillis() + startDelay; // Variable targetTime pour stocker le temps actuel + 120 minutes
}
else {
sb.setLength(0);
}
long remainingTime = targetTime - System.currentTimeMillis(); // variable remainingTime qui stocke le temps restant
final long hour = remainingTime/HOUR; // Variable qui stocke le nombre d'heures restantes contenues dans le nombre de millisecondes restantes
boolean prev = false;
if ( hour>0 ) {
sb.append(hour); // On affecte le nombre d'heures restantes dans la variable StringBuilder
sb.append(" H ");
remainingTime%=HOUR;
prev = true;
}
final long min = remainingTime/MIN; // Variable qui stocke le nombre de minutes restantes contenues dans le nombre de millisecondes restantes
if ( min>0 ) {
sb.append(min); // On affecte le nombre de minutes restantes dans la variable StringBuilder
sb.append(" m ");
remainingTime%=MIN;
prev = true;
}
else if ( prev ) {
sb.append("00 m ");
}
final long sec = remainingTime/SEC; // Variable qui stocke le nombre de secondes restantes contenues dans le nombre de millisecondes restantes
if ( sec>0 ) {
sb.append(sec); // On affecte le nombre de secondes restantes dans la variable StringBuilder
sb.append(" s");
}
else if ( prev ) {
sb.append("00 s");
}
System.out.println(sb); // ici affichage en console pour l'exemple
}
};
final TimerTask mainTask = new TimerTask() {
@Override
public void run() {
countingDownTask.cancel(); // on annule la tâche de décompte lorsque la tâche démarre
// on fait ce qu'on veut faire dans 120 min
System.out.println("On lance le boulot...");
}
@Override
public boolean cancel() { // Fonction qui annule la tâche principale
countingDownTask.cancel(); // si on annule la tâche principale, on annule aussi le décompte
return super.cancel();
}
};
final Timer timer = new Timer(); // On déclare un timer constant timer
timer.schedule(mainTask, startDelay); // on démarre la tâche principal, c'est à dire un décompte de startDelay
timer.scheduleAtFixedRate(countingDownTask, 1000, 1000); // tâche décompte avec un délai de 1 seconde et une fréquence de 1 secondes
}
} |