java - ejemplo - ¿Cómo eliminar una tarea de ScheduledExecutorService?
scheduledexecutorservice example (2)
Si su instancia de ScheduledExecutorService
amplía ThreadPoolExecutor
(por ejemplo, ScheduledThreadPoolExecutor
), puede usar remove(Runnable)
(pero consulte la nota en su javadoc: "Es posible que no elimine las tareas que se han convertido en otras formas antes de colocarlas en la cola interna". ) o purge()
.
Tengo un ScheduledExecutorService
que scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
algunas tareas diferentes periódicamente con scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
También tengo un Runnable
diferente que estoy usando con este planificador. el problema comienza cuando quiero eliminar una de las tareas del planificador.
¿Hay alguna forma de hacer esto?
¿Estoy haciendo lo correcto usando un planificador para diferentes tareas? ¿Cuál es la mejor manera de implementar esto?
Simplemente cancele el futuro devuelto por la scheduledAtFixedRate()
:
// Create the scheduler
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Create the task to execute
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
// Schedule the task such that it will be executed every second
ScheduledFuture<?> scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
// Wait 5 seconds
Thread.sleep(5000L);
// Cancel the task
scheduledFuture.cancel(false);
Otra cosa a tener en cuenta es que cancelar no elimina la tarea del programador. Todo lo que asegura es que el método isDone
siempre devuelve true
. Esto puede provocar pérdidas de memoria si continúa agregando dichas tareas. Por ejemplo: si comienza una tarea en función de alguna actividad del cliente o botón de IU, haga clic en, repítalo n veces y salga. Si se hace clic en ese botón muchas veces, puede terminar con una gran cantidad de subprocesos que no se pueden recolectar como basura ya que el programador todavía tiene una referencia.
Es posible que desee utilizar setRemoveOnCancelPolicy(true)
en la clase ScheduledThreadPoolExecutor
disponible en Java 7 en adelante. Para compatibilidad con versiones anteriores, el valor predeterminado es falso.