2012-07-29 34 views
11

Tengo un hilo que se encarga de realizar algunos procesos. Quiero que sea para que estos procesos se realicen cada 3 segundos. He usado el código a continuación, pero cuando comienza el hilo, no pasa nada. Supuse que cuando defino una tarea para mi temporizador ejecuta automáticamente el ScheduledTask dentro del intervalo de tiempo, pero no hace nada. ¿Qué me estoy perdiendo?Temporizador en el hilo de Java

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

    } 
}; 
+1

http://www.ibm.com/developerworks/java/library/j-schedule/index.html – nullpotent

+0

¿Estás seguro de que estás creando un hilo 'temperatureUp' y llamando a' start() 'en él? Este código funciona bien para mí. –

+0

¿Por qué usaría un hilo y un temporizador? El temporizador se ejecuta en su propio hilo –

Respuesta

1

Creo que el método que ha utilizado tiene la firma schedule(TimerTask task, long delay). Entonces, en realidad, solo está demorando la hora de inicio de la ÚNICA ejecución.

Para programarlo para que se ejecute cada 3 segundos que necesita para ir con este método schedule(TimerTask task, long delay, long period) donde se utiliza la tercera parámetro para dar el intervalo de tiempo.

puede hacer referencia la definición de clase Timer aquí para ser de más ayuda

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html

+0

con la línea 'increaserTimer.schedule (increaseTemperature, 2000, 2000);' ¡todavía no pasa nada! – Afflatus

+0

@Elham - ¿No lo había notado antes pero está generando un nuevo hilo dentro de otro hilo? Este es un enfoque muy equivocado. Considere cambiar su estructura para que los hilos se generen y programen desde un nivel global. Aquí hay un enlace con un proyecto de ejemplo que le ayudará a cambiar su estructura: http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml – afrin216

+0

en otras palabras, no puedo usar el temporizador para programar el serie de acciones que se realizan por un hilo. ¿derecho? – Afflatus

2

Con el fin de hacer algo cada tres segundos que debe utilizar scheduleAtFixedRate (ver javadoc).

Sin embargo, su código realmente no hace nada porque crea un hilo en el que inicia un temporizador justo antes de que se detenga la ejecución del hilo (no hay nada más que hacer). Cuando se dispara el temporizador (que es un solo disparo uno), no hay hilo para interrumpir (ejecución terminada antes).

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(); 
    } 
} 
15

Unos pocos errores en el fragmento de código:

  • amplía la clase de Thread, que no es realmente una buena práctica
  • Usted tiene una Timer dentro de un Thread? Eso no tiene sentido ya que a Timer se ejecuta solo Thread.

Debe más bien (cuando/si es necesario), implementar un Runnable ver here por un corto ejemplo, sin embargo, no puede ver la necesidad tanto de un Thread y Timer en el fragmento que le diste.

Por favor, vea el siguiente ejemplo de un Timer de trabajo que se limitará a incrementar el contador en uno cada vez que se llama (cada 3 segundos):

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 
    } 
} 

Adición:

hice un corto ejemplo de incorporar un Thread en la mezcla. Así que ahora la TimerTask se limitará a incrementar counter en 1 cada 3 segundos, y el Thread mostrará counter s valor de dormir durante 1 segundo cada vez que se comprueba contador (que terminará en sí y el temporizador después de 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 
    } 
} 
2
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++; 
    } 

} 
Cuestiones relacionadas