package ar.com.javacuriosities.concurrency.scheduled_executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/*
* Executors.newScheduledThreadPool() sirve para crear un Pool de 1 solo hilo, el cual
* será ejecutado de manera recurrente cada cierto tiempo
*/
public class Main {
public static void main(String[] args) {
try {
// Creamos un pool de 1 thread que será ejecutado cada cierto tiempo
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Creamos una tarea que será ejecutada cada 10 segundos
final Runnable beeper = new Beeper();
// Registramos en el scheduler esta tarea para ejecutarla cada 10 segundos sin delay
final ScheduledFuture<?> beeperHandler =
scheduler.scheduleAtFixedRate(beeper, 0, 10, TimeUnit.SECONDS);
// Registramos otra tarea para ser ejecutada en 60 segundos
scheduler.schedule(new BeeperCancel(beeperHandler), 60, TimeUnit.SECONDS);
scheduler.awaitTermination(90, TimeUnit.SECONDS);
scheduler.shutdown();
while (!scheduler.isTerminated()) {
}
} catch (InterruptedException e) {
// Log and Handle exception
e.printStackTrace();
}
}
private static final class Beeper implements Runnable {
public Beeper() {
}
@Override
public void run() {
System.out.println("beep");
}
}
/*
* BeeperCancel recibe un ScheduledFuture el cual nos permite
* interactuar con la tarea que es ejecutada de forma recurrente
* ya sea de para obtener su valor o cancelarla
*/
private static final class BeeperCancel implements Runnable {
private ScheduledFuture<?> beeperHandler;
public BeeperCancel(ScheduledFuture<?> beeperHandler) {
this.beeperHandler = beeperHandler;
}
@Override
public void run() {
System.out.println("Canceling Beeper");
beeperHandler.cancel(true);
}
}
}