¿Cuál es el propósito del método ScheduledFuture.get() si se recupera del método ScheduleWithFixedDelay/scheduleAtFixedRate?
-
21-12-2019 - |
Pregunta
Estoy confundido con lo siguiente
Lo sé, si uso el schedule
método de la ScheduledThreadPoolExecutor
clase:
ScheduledFuture<?> scheduledFuture =
scheduledThreadPoolExecutor.schedule(myClassRunnable, 5, TimeUnit.SECONDS);
Puedo recuperar más tarde el valor a través descheduledFuture.get(5, TimeUnit.SECONDS)
o scheduledFuture.get()
y debería ser nulo porque la tarea se ha ejecutado solo una vez y está completa.Y nulo porque estoy trabajando con el shedule's Runnable
versión del método y no con la shedule's Callable
versión del método.Está de acuerdo con la API.
Hasta aquí estoy bien.
Mi pregunta:
Cual es el proposito de ScheduledFuture
si se recupera del scheduleWithFixedDelay
(aún desde scheduleAtFixedRate
) método:
ScheduledFuture<?> scheduledFuture=
scheduledThreadPoolExecutor.scheduleWithFixedDelay(myClassRunnable, 1, 5, TimeUnit.SECONDS);
Si, conozco ambos fijado Los métodos ejecutan la misma tarea muchas veces hasta que ScheduledThreadPoolExecutor's shutdown
Se llama al método (debe detener todas las tareas programadas).
Hice una investigación a través de Google buscando algunos ejemplos usando ScheduledFuture
regresó de scheduleWithFixedDelay
, sólo encontré uno usando el Cancelar método, para cancelar una tarea específica.Pero ninguno trabaja con conseguir.
No sé si me equivoco, pero me parece inútil conseguir método si estamos trabajando con scheduleWithFixedDelay
, porque si uso más tarde:
- chedFuture.get(): permanece en espera y el objeto Runnable sigue funcionando muchas veces (ejecutar, completar, retrasar, ejecutar, etc.).)
- ScheduledFuture.get(32, TimeUnit.SECONDS): siempre aparece TimeoutException
Pensé que debería poder recuperar el valor nulo ya que puedo usar el period
argumento/parámetro del scheduleWithFixedDelay
método. Quiero decir:ejecute el objeto Runnable, espere hasta que se complete y use programadoFuture.get() para obtener el valor nulo que confirma que se ha completado, espere el período de retraso para ejecutar nuevamente el objeto Runnable de acuerdo con el period
valor etc....
Aclaraciones y ejemplos son totalmente bienvenidos.
Gracias de antemano.
Solución
PROGRAMADURAFUTE Se puede usar para que se deje tiempo antes de la próxima tarea de ejecución:
ScheduledFuture<?> f = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("run");
}
}, 0, 10000, TimeUnit.MILLISECONDS);
Thread.sleep(1000);
System.out.println("Time left before next run " + f.getDelay(TimeUnit.MILLISECONDS));
imprime
run
Time left before next run 8999
Otros consejos
Yo pensaría que en el caso de usar .scheduleWithFixedDelay(...)
(o scheduleAtFixedRate(...)
), el get()
método de la devolución ScheduledFuture<?>
De hecho, se siente como un ajuste extraño.
Creo que nunca recibirás nada del get()
método, solo espere que se genere una excepción cuando se cancele Runnable.
Seguramente se puede ver un caso de uso para esto ;-)
ver JavaDoc
Devoluciones:un ScheduledFuture que representa la finalización pendiente de la tarea, y cuyo método get() generará una excepción al cancelarla
Uso de ScheduledFuture.get () Puede obtener un asa a la tarea, y en caso de que se pueda cancelar esta tarea, indique manualmente desde el interfaz de usuario o en función de algunas condiciones como la nula, la manija se puede usar para cancelarla.