studio stop not example ejemplo cancel java timer schedule

java - stop - ¿Cómo programo que una tarea se ejecute a intervalos periódicos?



timer.schedule android studio (7)

Estaba intentando algunos códigos para implementar una tarea programada y se me ocurrieron estos códigos.

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

Esperaba que el compilador imprimiera una serie de Mahendra Singh a intervalos periódicos de 3 s, pero a pesar de esperar unos 15 minutos, obtengo solo una salida ... ¿Cómo resuelvo esto?



ScheduledExecutorService

Deseo ofrecerle una alternativa a Timer usando - ScheduledThreadPoolExecutor , una implementación de la interfaz ScheduledExecutorService . Tiene algunas ventajas sobre la clase Timer (de "Java en Concurrencia"):

Un temporizador crea solo un hilo para ejecutar tareas de 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 Timer es que se comporta mal si un TimerTask arroja una excepción no verificada. 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.


El programador de Quartz también es una solución y, en primer lugar, usted hace la clase Quartz Job.

Trabajo de cuarzo se define lo que quiere 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 necesitas hacer Quartz Trigger

Hay dos tipos de disparadores en Quartz

SimpleTrigger : permite establecer la hora de inicio, la hora de finalización y el intervalo de repetición.

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

CronTrigger : permite que la expresión cron de Unix especifique las fechas y horas para ejecutar su trabajo.

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

La clase Scheduler vincula Job y Trigger juntos y lo ejecuta.

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

Ejemplo completo que puedes ver aquí


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

  • java.util.Timer es una clase de utilidad que se puede utilizar para programar un hilo que se ejecutará en un momento determinado en el futuro. La clase Java Timer se puede usar para programar una tarea que se ejecutará una sola vez o para que se ejecute a intervalos regulares.
  • java.util.TimerTask es una clase abstracta que implementa la interfaz Runnable y necesitamos extender esta clase para crear nuestra propia TimerTask que se puede programar usando la clase de temporizador de Java.

Puede consultar el 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);


Use timer.scheduleAtFixedRate

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

Programa la tarea especificada para la ejecución de tasa fija repetida, comenzando después del retraso especificado. Las ejecuciones posteriores tienen lugar aproximadamente a intervalos regulares, separadas por el período especificado.
En la ejecución de tasa 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 hacer sonar un timbre cada hora por hora o ejecutar el 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: tarea que debe programarse.
  • 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 el retraso + System.currentTimeMillis () es negativo.
  • IllegalStateException: si la tarea ya estaba programada o cancelada, el temporizador se canceló o el hilo del temporizador finalizó.

timer.scheduleAtFixedRate (nueva Tarea (), 1000,3000);


public void schedule(TimerTask task,long delay)

Programa la tarea especificada para la ejecución después del retraso especificado.

usted quiere:

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

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