2012-01-29 25 views
9

Quiero tener una clase que cambie sus propias variables privadas cada 2 segundos. Yo sé que si hago algo así comoCrear un recordatorio de temporizador repetitivo en Java

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.schedule(new ChangeSomething(), 2000); 

Se ejecutará ChangeSomething() Después de 2 segundos, hay una manera de decir que de hacer algo cada 2 segundos, o, Si pongo el interior ChangeSomething()

timer.schedule(new ChangeSomething(), 2000); 

¿funcionará?

En una nota al margen, ¿qué hace exactamente timer.cancel()?

Respuesta

11

Uso timer.scheduleAtFixedRate() a programarlo para que se repita cada dos segundos:

programa la tarea especificada para la ejecución repetida de tasa fija, a partir de la hora especificada. Las ejecuciones posteriores tienen lugar aproximadamente a intervalos regulares, separadas por el período especificado.

Desde el Javadoc para Timer.cancel():

termina este temporizador, descartando cualquier tareas programadas actualmente. No interfiere con una tarea que se está ejecutando actualmente (si existe). Una vez que se ha terminado el temporizador, el hilo de ejecución finaliza con elegancia y no se pueden programar más tareas en él.

EDIT:

En relación con hilo de ejecución interno para una Timer que ejecuta una sola tarea una vez:

Después de la última referencia en vivo a un objeto Timer desaparece y todas las tareas pendientes han completado ejecución, el subproceso de ejecución de tarea del temporizador finaliza correctamente (y queda sujeto a la recolección de elementos no utilizados). Sin embargo, esto puede demorar arbitrariamente en ocurrir. De forma predeterminada, el hilo de ejecución de la tarea no se ejecuta como un hilo de daemon, por lo que es capaz de evitar que una aplicación finalice. Si una persona que llama quiere terminar el hilo de ejecución de tareas de un temporizador rápidamente, la persona que llama debe invocar el método de cancelación del temporizador.

+0

Lo que no entiendo de timer.cancel(), es si se requiere hacer después de hacer una tarea que es era programado solo una vez para asegurarse de que no se volverá a hacer o no? – SIMEL

+0

El Javadoc para 'Timer' indica que esto no es necesario y que el hilo de ejecución del temporizador terminará. Sin embargo, especifica específicamente que esto puede tomar un tiempo arbitrariamente largo y 'cancel()' puede usarse para terminarlo más rápido. (Se pegó el párrafo relevante de Javadoc en la respuesta). – hmjd

0

Para ser más precisos aquí: ChangeSomething() es el constructor de su clase ChangeSomething. El constructor se ejecutará inmediatamente cuando pase el objeto Instace ChangeSomething al temporizador, no después de 2 segundos. Es el método run() de ese objeto que se activará después de 2 segundos.

para ejecutar ese método run() varias veces en los 2 segundos, utilice schedule(TimerTask task, long delay, long period)

6

Usted tendrá que llamar a un método diferente de la programación del temporizador, llamado scheduleAtFixedRate (...) que puede llegar a 3 parámetros. Los primeros 2 son idénticos a los del programa que ha usado, mientras que el tercer parámetro indica un período de tiempo en milisegundos entre ejecuciones sucesivas de tareas.

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000); 

Puede comprobar el doc java pai para este método aquí: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, java.util.Fecha, tiempo)

2

Este es un ejemplo

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Test extends TimerTask { 
    private int age; 

    public Test() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(this, new Date(), 2000); 
    } 

    /** 
    * Implements TimerTask's abstract run method. 
    */ 
    public void run(){ 
     //toy implementation 
     System.out.print("Changing Data ... before change age is "+age+" "); 
     changeAge(); 
     System.out.println("after change age is "+age); 

    } 


    private void changeAge() { 
     age = (int)Math.round(Math.random()*1000); 
    } 

    public static void main(String[] args) { 
      new Test(); 
    } 

}

+0

nuevo Timer(); = no es posible, necesitas agregar parámetros ¿no? –

+0

@SvenB De acuerdo con los documentos de Java: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html, Timer tiene un constructor predeterminado. –

Cuestiones relacionadas