example ejemplo java android scheduledexecutorservice

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.