¿Existe alguna manera de detener la repetición de tareas desde la propia tarea cuando se ejecuta en un ScheduledExecutorService?Detener una tarea periódica desde dentro de la tarea que se ejecuta en un ScheduledExecutorService
permite decir, he la siguiente tarea:
Future<?> f = scheduledExecutor.scheduleAtFixedRate(new Runnable() {
int count = 0;
public void run() {
System.out.println(count++);
if (count == 10) {
// ??? cancel self
}
}
}, 1, 1, TimeUnit.SECONDS);
Desde fuera, es fácil de cancelar a través de f.cancel(), pero ¿cómo puedo evitar la repetición en el lugar especificado? (Pasar el futuro a través de una AtomicReference no es seguro, porque hay una ventana potencial cuando scheduleAtFixedRate devuelve f tarde y la variable también se establece tarde, y la tarea en sí misma podría haberse ejecutado, viendo un nulo en la referencia).
¿Por qué no lanzar una excepción StopIteration que puede atrapar para eliminar la llamada del ejecutor desde el exterior? Por lo que sé, Callable's no tiene conocimiento del ejecutor al que están agregados. – Tim
la manera más simple y bastante fea es lanzar una excepción :) – bestsss