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:
- ¿Cómo programo una tarea para que se ejecute a intervalos periódicos?
- ¿Cómo puedo ejecutar mi TimerTask todos los días 2 PM
- ¿Cómo ejecutar cierta tarea todos los días a una hora determinada utilizando ScheduledExecutorService?
- Java ejecuta la tarea con varios reintentos y un tiempo de espera
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
.