J'ai un fil qui est chargé de faire certains processus. Je veux faire en sorte que ces traitements soient effectués toutes les 3 secondes. J'ai utilisé le code ci-dessous mais lorsque le thread démarre, rien ne se passe. J'ai supposé que lorsque je définissais une tâche pour mon minuteur, il exécutait automatiquement le ScheduledTask
dans un intervalle de temps mais il ne faisait rien du tout. Qu'est-ce que je rate?
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);
}
};
Quelques erreurs dans votre extrait de code:
Thread
, ce qui n'est pas vraiment une bonne pratiqueTimer
dans un Thread
? Cela n'a pas de sens car a Timer
s'exécute sur son propre Thread
.Vous devriez plutôt (quand/où cela est nécessaire), implémenter un Runnable
voir ici pour un court exemple, mais je ne vois pas la nécessité à la fois d'un Thread
et Timer
dans l'extrait que vous avez donné.
Veuillez voir l'exemple ci-dessous d'un Timer
qui va simplement incrémenter le compteur d'un à chaque appel (toutes les 3 secondes):
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:
J'ai fait un petit exemple d'incorporation d'un Thread
dans le mix. Alors maintenant, le TimerTask
augmentera simplement counter
de 1 toutes les 3 secondes, et le Thread
affichera la valeur de counter
s dormant pendant 1 seconde à chaque fois qu'il vérifie le compteur (il se terminera lui-même et le chronomètre après 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
}
}
import Java.util.Timer;
import Java.util.TimerTask;
public class ThreadTimer extends TimerTask{
static int counter = 0;
public static void main(String [] args) {
Timer timer = new Timer("MyTimer");
timer.scheduleAtFixedRate(new ThreadTimer(), 30, 3000);
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("TimerTask executing counter is: " + counter);
counter++;
}
}
Pour faire quelque chose toutes les trois secondes, vous devez utiliser scheduleAtFixedRate (voir javadoc ).
Cependant, votre code ne fait vraiment rien car vous créez un thread dans lequel vous démarrez une minuterie juste avant l'arrêt de l'exécution du thread (il n'y a plus rien à faire). Lorsque le chronomètre (qui est un seul tournage) se déclenche, il n'y a pas de thread à interrompre (exécution terminée avant).
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");
//start a 3 seconds timer 10ms later
increaserTimer.scheduleAtFixedRate(increaseTemperature, 3000, 10);
while(true) {
//give it some time to see timer triggering
doSomethingMeaningful();
}
}
Je pense que la méthode que vous avez utilisée a la signature schedule(TimerTask task, long delay)
. Donc, en fait, vous retardez simplement l'heure de début de la SEULE exécution.
Pour planifier son exécution toutes les 3 secondes, vous devez utiliser cette méthode schedule(TimerTask task, long delay, long period)
où le troisième paramètre est utilisé pour donner la période intervalle.
Vous pouvez vous référer à la définition de la classe Timer ici pour être d'une aide supplémentaire
http://docs.Oracle.com/javase/1.4.2/docs/api/Java/util/Timer.html