2012-01-16 7 views
6

Tengo una pregunta con respecto al método scheduleAtFixedRate() en ScheduledExecutorService en Java 6.Comportamiento de ScheduledExecutorService.scheduleAtFixedRate de Java()

[editar : el Javadoc de 1.6 es más completa que la de 1.5. Véase el comentario a continuación]

dado que:

  • la ScheduledExecutorService se construye con N = 1 hilo en la piscina
  • la tasa fija es un período de T segundos
  • ningún retraso inicial

Lo que sucede en este caso (los tiempos no están destinados a ser absoluto, en el sentido de tiempo real):

  • en el tiempo T, el servicio inicia una tarea Ejecutable, "Task1"
  • en el tiempo 2T, Task1 aún no ha terminado, y el servicio está programado para disparar

¿Está el servicio garantizado para hacer cualquier ¿de los siguientes?

  • (a) al 2T, inicio a una tarea ejecutable, "Task2" (recuperación de N = 1)
  • (b) bloque hasta Task1 está terminado
  • (c) omitir este tiempo y tratar de nuevo en el 3T
  • (d) comportamiento no está definido

O algo más? ¿La respuesta cambia si N> 1?

+0

Estaba viendo el documento Java 1.5 (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate%28java.lang.Runnable, % 20long,% 20long,% 20java.util.concurrent.TimeUnit% 29), que no tiene la respuesta. Al escribir esta pregunta, me vinculé al documento 1.6 sin mirarlo de cerca. Como verá, la respuesta para 1.6 es evidente. –

Respuesta

6

La respuesta es

(b) de bloques hasta que se termina Task1

y que es independientemente del número de roscas del ejecutor (Task2 incluso podría no ser presentada).

El doctor dice:

Si cualquier ejecución de esta tarea tarda más de su periodo, a continuación, las ejecuciones posteriores pueden comenzar tarde, pero no al mismo tiempo se ejecutará.

(Por cierto, ya que no hay retraso intial, "Task1" patada de salida será de inmediato como doc`ed:

ejecuciones comenzarán después initialDelay

).

1

De la documentación que haya vinculado ...

Si cualquier ejecución de esta tarea tarda más de su periodo, a continuación, las ejecuciones posteriores pueden comenzar tarde, pero no se ejecute concurrentemente.

Cuestiones relacionadas