Tengo una tarea que me obliga a programar tareas y eliminarlas cuando ocurre un determinado evento. Estoy usando un ScheduledThreadPoolExecutor para programar las tareas, eso es bastante sencillo. Pero, encontré dos formas de cancelar los artículos pendientes, ambos se ven un poco extraños.Cómo cancelar elementos pendientes de un ScheduledThreadPoolExecutor?
Tengo curiosidad por si alguno de ellos tiene calidad de producción. Si ninguno de ellos, ¿qué sugieres?
Aquí es un esqueleto de lo que hago:
private final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
public void doStuff() {
//...
scheduler.schedule(new Runnable() {/*...*/}, 10, TimeUnit.MILISECONDS)
}
public void actOnEvent() {
cancelPendingItems();
doMoreStuff();
}
public void cancelPendnigItems() {
// TODO implement me
}
Este es el candidato 1:
public void cancelPendingItems() {
scheduler.getQueue().clear();
}
Ésta es candidato 2:
public void cancelPendingItems() {
for (Runnable task : scheduler.getQueue()) {
scheduler.remove(task);
}
}
Ambos se ven como un truco para porque dependen de la propiedad ScheduledThreadPoolExecutor.queue que no está especificada en la interfaz ScheduledExecutor . Estoy un poco preocupado de que pueda violar una invariante de ScheduledThreadPoolExecutor y lo detectaré demasiado tarde.
Entonces, ¿van a hacer estos fragmentos lo que yo quiero que hagan? ¿Hay alguna forma mejor/más limpia de hacerlo?
Gracias! Afortunadamente, se ajusta a mi problema real porque no hay demasiadas tareas posibles, por lo que esta limpieza será razonablemente rápida. Lo cual es importante para nuestra aplicación con recursos limitados. –