Algunas veces la duración de una tarea repetida es más larga que su período (en mi caso, esto puede suceder durante horas) . Piense en una tarea repetida que tarda 7 minutos en ejecutarse y está programada para ejecutarse cada 10 minutos, pero a veces lleva 15 minutos por cada ejecución durante unas horas seguidas.Programe un ejecutable repetitivo de subproceso simple en java, pero omita la ejecución actual si la ejecución anterior no finaliza
Las clases Timer y ScheduledThreadPoolExecutor tienen un método scheduleAtFixedRate que generalmente se usa para este tipo de funcionalidad. Sin embargo, ambos tienen la característica de que "intentan ponerse al día cuando se quedan atrás". En otras palabras, si un temporizador se retrasa con algunas ejecuciones, crea una cola de trabajo en la que se trabajará continuamente hasta que recupere el número de ejecuciones que habría sucedido si ninguna de las tareas hubiera llevado más tiempo. el período especificado. Quiero evitar este comportamiento omitiendo la ejecución actual si la ejecución anterior no está completa.
Tengo una solución que implica jugar con el método afterExecution de un ejecutor agrupado, recalcular un retraso y reprogramar el ejecutable con el nuevo retraso, pero me preguntaba si hay una manera más simple, o si esta funcionalidad ya existe en una biblioteca común en alguna parte. Sé acerca de la programación con un retraso fijo en lugar de un período fijo, pero esto no funcionará para mí, ya que es importante tratar de ejecutar las tareas en los horarios establecidos. ¿Hay opciones más simples que mi solución afterExecution?
Lo más sencillo es verificar su tarea si ya hay otra instancia ejecutándose y, de ser así, disparar inmediatamente. –
@ Hot Licks: ScheduledExecutorService en realidad no los ejecuta en paralelo. –
Entonces, ¿cuál es el requisito clave aquí? ¿Que solo y siempre comienza en ** a ** intervalo de 10 minutos, independientemente de si se perdió uno? Si es así, no estás hablando de una tasa. –