Java Language Programar tareas para que se ejecuten a una hora determinada, después de un retraso o repetidamente


Ejemplo

La clase ScheduledExecutorService proporciona métodos para programar tareas únicas o repetidas de varias maneras. El siguiente ejemplo de código supone que el pool se ha declarado e inicializado de la siguiente manera:

ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

Además de los métodos normales de ExecutorService , la API ScheduledExecutorService agrega 4 métodos que programan tareas y devuelven objetos ScheduledFuture . Este último se puede utilizar para recuperar resultados (en algunos casos) y cancelar tareas.

Iniciar una tarea después de un retraso fijo

El siguiente ejemplo programa una tarea para comenzar después de diez minutos.

ScheduledFuture<Integer> future = pool.schedule(new Callable<>() {
        @Override public Integer call() {
            // do something
            return 42;
        }
    }, 
    10, TimeUnit.MINUTES);

Comenzando tareas a una tasa fija

El siguiente ejemplo programa una tarea para comenzar después de diez minutos, y luego repetidamente a una velocidad de una vez cada minuto.

ScheduledFuture<?> future = pool.scheduleAtFixedRate(new Runnable() {
        @Override public void run() {
            // do something
        }
    }, 
    10, 1, TimeUnit.MINUTES);

La ejecución de la tarea continuará de acuerdo con el cronograma hasta que la pool se cierre, el future se cancele o una de las tareas encuentre una excepción.

Se garantiza que las tareas programadas por una llamada scheduledAtFixedRate AtFixedRate no se superpondrán en el tiempo. Si una tarea lleva más tiempo que el período prescrito, las ejecuciones de la siguiente tarea y las posteriores pueden comenzar tarde.

Comenzando tareas con un retraso fijo

El siguiente ejemplo programa una tarea para comenzar después de diez minutos, y luego repetidamente con un retraso de un minuto entre el final de una tarea y el inicio de la siguiente.

ScheduledFuture<?> future = pool.scheduleWithFixedDelay(new Runnable() {
        @Override public void run() {
            // do something
        }
    }, 
    10, 1, TimeUnit.MINUTES);

La ejecución de la tarea continuará de acuerdo con el cronograma hasta que la pool se cierre, el future se cancele o una de las tareas encuentre una excepción.