2010-12-28 19 views
68

Estaba intentando algunos códigos para implementar una tarea programada y se me ocurrieron estos códigos.¿Cómo programo que una tarea se ejecute a intervalos periódicos?

import java.util.*; 

class Task extends TimerTask { 


    int count = 1; 

    // run is a abstract method that defines task performed at scheduled time. 
    public void run() { 
     System.out.println(count+" : Mahendra Singh"); 
     count++; 
    } 
} 

class TaskScheduling { 

    public static void main(String[] args) { 
     Timer timer = new Timer(); 


     // Schedule to run after every 3 second(3000 millisecond) 
     timer.schedule(new Task(), 3000); 
    } 
} 

Mi salida:

1 : Mahendra Singh 

Yo esperaba que el compilador para imprimir una serie de Mahendra Singh en intervalos periódicos de 3 s pero a pesar de la espera de unos 15 minutos, consigo solamente una salida ... ¿Cómo resuelvo esto?

+0

** Programador de cuarzo ** para ayudar a la aplicación Java a programar un trabajo/tarea para que se ejecute en una fecha y hora especificadas [ver ejemplo completo de eso] (http://geekonjava.blogspot.com/2015/05/how -to-scheduling-job-in-java-via.html) – GeekOnJava

Respuesta

58

Uso timer.scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, 
           long delay, 
           long period) 

programa la tarea especificada para la ejecución repetida de tasa fija, comenzando después del retardo especificado. Las ejecuciones posteriores tienen lugar aproximadamente a intervalos regulares, separadas por el período especificado.
En la ejecución de velocidad fija, cada ejecución se programa en relación con el tiempo de ejecución programado de la ejecución inicial. Si una ejecución se retrasa por algún motivo (como recolección de basura u otra actividad de fondo), dos o más ejecuciones ocurrirán en sucesión rápida para "ponerse al día". A largo plazo, la frecuencia de ejecución será exactamente la recíproca del período especificado (suponiendo que el reloj del sistema subyacente Object.wait (long) sea exacto).

La ejecución de velocidad fija es apropiada para actividades recurrentes que son sensibles al tiempo absoluto, como sonar un timbre cada hora en horas o ejecutar mantenimiento programado todos los días en un momento determinado. También es apropiado para actividades recurrentes en las que el tiempo total para realizar un número fijo de ejecuciones es importante, como un temporizador de cuenta regresiva que hace tictac una vez por segundo durante diez segundos. Finalmente, la ejecución de velocidad fija es apropiada para programar múltiples tareas de temporizador repetido que deben permanecer sincronizadas entre sí.

Parámetros:

  • tarea - la tarea de programar.
  • retraso: demora en milisegundos antes de ejecutar la tarea.
  • período - tiempo en milisegundos entre ejecuciones sucesivas de tareas.

Lanza:

  • IllegalArgumentException - si el retraso es negativo, o retraso + System.currentTimeMillis() es negativo.
  • IllegalStateException: si la tarea ya estaba programada o cancelada, se canceló el temporizador o finalizó la secuencia del temporizador.
+3

scheduleAtFixedRate no resuelve su problema de obtener la salida solo una vez. –

+0

@ JamesA.N.Stauffer, necesita la salida repetidamente, no una vez. – st0le

+1

Sí, pero la repetición simplemente se logra agregando un tercer argumento: no es necesario cambiar el método. –

12
public void schedule(TimerTask task,long delay) 

Programa la tarea especificada para la ejecución después de la demora especificada.

que desee:

public void schedule(TimerTask task, long delay, long period) 

programa la tarea especificada para repetida ejecución de retardo fijo, comenzando después del retardo especificado. Las ejecuciones posteriores tienen lugar aproximadamente a intervalos regulares separados por el período especificado.

3

Puede utilizar Quartz

+20

-1 Sin embargo, se necesita otra biblioteca solo para una tarea básica que se puede hacer con el marco existente. sí, el cuarzo puede hacer más, pero no es útil en el contexto de esta pregunta – JDC

+2

@JDC: ¿Por qué reinventar la rueda? –

+0

Estoy de acuerdo con los comentarios anteriores, pero diría que esta sería una respuesta correcta si daba un ejemplo. Las reglas SO dicen que un enlace no es una respuesta. Esto debería ser un comentario. –

65

ScheduledExecutorService

deseo de ofrecer una alternativa al uso de temporizador - ScheduledThreadPoolExecutor, una implementación de la interfaz ScheduledExecutorService. Tiene algunas ventajas sobre la clase del temporizador (desde "Java en concurrencia"):

Un temporizador crea solo un hilo para ejecutar tareas del temporizador. Si una tarea del temporizador tarda demasiado tiempo en ejecutarse, la precisión del tiempo de otros TimerTasks puede verse afectada. Si un TimerTask recurrente está programado para ejecutarse cada 10 ms y otro Timer-Task tarda 40 minutos en ejecutarse, la tarea recurrente (dependiendo de si se programó a velocidad fija o retardo fijo) se llama cuatro veces en rápida sucesión después de la larga -la tarea completa completa, o "falla" cuatro invocaciones por completo. Los grupos de subprocesos programados solucionan esta limitación permitiéndole proporcionar varios subprocesos para ejecutar tareas diferidas y periódicas.

Otro problema con el temporizador es que se comporta mal si un TimerTask arroja una excepción sin marcar. El subproceso Timer no capta la excepción, por lo que una excepción sin marcar lanzada desde un TimerTask termina el subproceso del temporizador. El temporizador tampoco resucita el hilo en esta situación; en su lugar, supone erróneamente que todo el temporizador fue cancelado. En este caso, las TimerTasks que ya están programadas pero que aún no se han ejecutado nunca se ejecutan y no se pueden programar tareas nuevas. (Este problema, llamado "fuga de hilo").

Y otra recomendación si necesita construir su propio servicio de programación, puede que aún pueda aprovechar la biblioteca mediante el uso de DelayQueue, una implementación de BlockingQueue que proporciona la funcionalidad de programación de ScheduledThreadPoolExecutor. Un DelayQueue administra una colección de objetos demorados. Un retraso tiene un tiempo de retraso asociado: DelayQueue le permite tomar un elemento solo si su retraso ha expirado. Los objetos se devuelven desde un DelayQueue ordenado por el tiempo asociado a su retraso.

+2

Otro problema con el temporizador es que al cambiar el reloj del sistema, se equivoca con el temporizador – rajath

0

Para este propósito Java tiene la clase Timer y TimerTask, pero ¿qué es?

  • java.util.Timer es una clase de utilidad que puede ser utilizado para programar un hilo para ser ejecutado en un momento determinado en el futuro. La clase del temporizador Java puede ser para programar una tarea que se ejecutará una sola vez o se ejecutará a intervalos regulares de .
  • java.util.TimerTask es una clase abstracta que implementa la interfaz Ejecutable y tenemos que extender esta clase para crear nuestra propia TimerTask que puede ser programado usando clase Timer java.

Puede comprobar tutorial completo de GeekonJava

TimerTask timerTask = new MyTimerTask(); 

//running timer task as daemon thread 

Timer timer = new Timer(true); 

timer.scheduleAtFixedRate(timerTask, 0, 10*1000); 
3

cuarzo programador es también una solución y en primer lugar se crea la clase de cuarzo de empleo.

cuarzo trabajo se define lo que se desea ejecutar

package com.blogspot.geekonjava.quartz; 
import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.quartz.JobKey; 
public class QuartzJob implements Job { 
     public void execute(JobExecutionContext context) 
         throws JobExecutionException { 
       JobKey jobKey = context.getJobDetail().getKey(); 
       System.out.println("Quartz" + "Job Key " + jobKey); 
     } 
} 

Ahora tiene que hacer cuarzo gatillo

Hay dos tipos de disparadores de cuarzo

SimpleTrigger - Permite establecer la hora de inicio, la hora de finalización, el intervalo de repetición.

Trigger trigger = newTrigger().withIdentity("TriggerName", "Group1") 
       .withSchedule(SimpleScheduleBuilder.simpleSchedule() 
       .withIntervalInSeconds(10).repeatForever()).build(); 

CronTrigger - Permite la expresión cron de UNIX para especificar las fechas y tiempos para ejecutar su trabajo.

Trigger trigger = newTrigger() 
       .withIdentity("TriggerName", "Group2") 
       .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); 

enlaces de clase Programador tanto empleo y gatillo juntos y ejecutarlo.

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.start(); 
scheduler.scheduleJob(job, trigger); 

Full Example you can see here

1

timer.scheduleAtFixedRate (nuevo Grupo(), 1000,3000);

Cuestiones relacionadas