web-dev-qa-db-fra.com

Minuterie dans Java Thread

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);

    }
};
18
Afflatus

Quelques erreurs dans votre extrait de code:

  • Vous étendez la classe Thread, ce qui n'est pas vraiment une bonne pratique
  • Vous avez un Timer 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 counters 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
    }
}
21
David Kroukamp
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++;
   }

}
4
Nay

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();
    }
}
2
Daniel Voina

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

1
afrin216