¿Cuál es el propósito del método ScheduledFuture.get() si se recupera del método ScheduleWithFixedDelay/scheduleAtFixedRate?

StackOverflow https://stackoverflow.com//questions/25049021

  •  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.

¿Fue útil?

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

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java.util.concurrent.TimeUnit-

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top