2010-10-28 14 views
5

De leer en Desbordamiento de pila He visto que muchos de ustedes no recomiendan usar Tarea de temporizador. Hmmm ... pero ya esta implementado:programa de tareas del temporizador de Java

tengo este código:

detectionHandlerTimer.schedule(myTimerTask, 60 * 1000, 60 * 1000); 

La cosa es que el trabajo de myTimerTask dura algún tiempo.

Me gustaría que este comportamiento:

  1. esperar 60 seg.
  2. tarea durante un tiempo (por ejemplo, 40 - 100 seg).
  3. tarea finalizada.
  4. espere 60 segundos.
  5. tarea durante un tiempo (por ejemplo, 40 - 100 seg).

Pero el código anterior se comporta como este

  1. esperar 60 seg.
  2. tarea durante un tiempo (por ejemplo, 40 - 100 seg).
  3. tarea finalizada
  4. tarea durante algún tiempo (por ejemplo, 40 - 100 seg).

Como la duración del tiempo de la tarea es superior a 60, el temporizador inicia la tarea inmediatamente después de finalizar la tarea. Pero me gustaría que esperara nuevamente.

+1

puede ver las capacidades de programación de primavera o directamente en el proyecto de programador de cuarzo –

Respuesta

10

Esto funciona. La clave es hacer que la tarea misma (después de que se complete) programe la próxima aparición de la tarea.

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

public class TaskManager { 

    private Timer timer = new Timer(); 

    public static void main(String[] args) { 
     TaskManager manager = new TaskManager(); 
     manager.startTask(); 
    } 

    public void startTask() { 
     timer.schedule(new PeriodicTask(), 0); 
    } 

    private class PeriodicTask extends TimerTask { 
     @Override 
     public void run() { 
      System.out.println(System.currentTimeMillis() + " Running"); 

      /* replace with the actual task */ 
      try { 
       Thread.sleep(15 * 1000); 
      } catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 
      /* end task processing */ 

      System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now"); 
      timer.schedule(new PeriodicTask(), 10 * 1000); 
     } 
    } 
} 

que imprime:

$ javac TaskManager.java && java TaskManager 
1288282514688 Running 
1288282529711 Scheduling 10 seconds from now 
1288282539712 Running 
1288282554713 Scheduling 10 seconds from now 
1288282564714 Running 

Esto es lo que parece que si usted extrae los segundos componentes de las marcas de tiempo (para mayor claridad):

$ javac TaskManager.java && java TaskManager 
14         Running 
29 (+15 seconds execution)   Scheduling 10 seconds from now 
39 (+10 seconds delay until next run) Running 
54 (+15 seconds execution)   Scheduling 10 seconds from now 
64 (+10 seconds delay until next run) Running 

basta con sustituir los 10 s con 60 s.

+0

que hizo el truco, tnx. – vale4674

+1

Sí; Descubrí cuándo quieres reprogramar el temporizador; se necesita una nueva instancia de timerTask. – sajad

Cuestiones relacionadas