newscheduledthreadpool example ejemplo java scheduled-tasks scheduledexecutorservice

example - scheduler java ejemplo



¿Cómo programo una tarea para que se ejecute una vez? (2)

Gracias funcionó para mí. Utilicé el programador para programar una tarea en un intervalo de lote calculado en tiempo de ejecución.

manualTriggerBatchJob.setSchedulingProperties(pblId, batchInterval); ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); @SuppressWarnings("unchecked") ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(manualTriggerBatchJob, batchIntervalInMin,TimeUnit.MILLISECONDS);

Quiero demorar en hacer algo, en la línea de configurar un temporizador de cuenta regresiva que "hará una cosa" después de un cierto tiempo.

Quiero que el resto de mi programa siga funcionando mientras espero, así que intenté hacer mi propio Thread que contenía un retraso de un minuto:

public class Scratch { private static boolean outOfTime = false; public static void main(String[] args) { Thread countdown = new Thread() { @Override public void run() { try { // wait a while System.out.println("Starting one-minute countdown now..."); Thread.sleep(60 * 1000); // do the thing outOfTime = true; System.out.println("Out of time!"); } catch (InterruptedException e) { e.printStackTrace(); } } }; countdown.start(); while (!outOfTime) { try { Thread.sleep(1000); System.out.println("do other stuff here"); } catch (InterruptedException e) { e.printStackTrace(); } } } }


Mientras esto funcionaba, más o menos, parecía que debería haber una mejor manera de hacerlo.

Después de algunas búsquedas, encontré un montón de preguntas como estas, pero realmente no abordan lo que estoy tratando de hacer:

No necesito nada tan complicado; Solo quiero hacer una sola cosa después de un cierto tiempo y dejar que el resto del programa aún se ejecute.

¿Cómo debo hacer para programar una tarea única para "hacer una cosa"?


Si bien el java.util.Timer solía ser una buena forma de programar futuras tareas, ahora es preferible 1 usar las clases en el paquete java.util.concurrent .

Existe un ScheduledExecutorService que está diseñado específicamente para ejecutar un comando después de un retraso (o para ejecutarlos periódicamente, pero eso no es relevante para esta pregunta).

Tiene un schedule(Runnable, long, TimeUnit) que

Crea y ejecuta una acción de un solo disparo que se habilita después del retraso dado.


Usando un ScheduledExecutorService usted podría reescribir su programa así:

import java.util.concurrent.*; public class Scratch { private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) { System.out.println("Starting one-minute countdown now..."); ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() { @Override public void run() { // do the thing System.out.println("Out of time!"); }}, 1, TimeUnit.MINUTES); while (!countdown.isDone()) { try { Thread.sleep(1000); System.out.println("do other stuff here"); } catch (InterruptedException e) { e.printStackTrace(); } } scheduler.shutdown(); } }

Una de las cosas agradables que obtiene al hacer las cosas de esta manera es el objeto ScheduledFuture<?> Que obtiene de la schedule() llamadas schedule() .

Esto le permite deshacerse de la variable boolean adicional, y simplemente verificar directamente si el trabajo se ha ejecutado.

También puede cancelar la tarea programada si no desea esperar más llamando a su método cancel() .


1 Ver Java Timer vs ExecutorService? por razones para evitar el uso de un Timer a favor de un ExecutorService .