2011-09-07 15 views
8

Tengo una tarea que deseo ejecutar a una tarifa fija. Sin embargo, también necesito el resultado de la tarea después de cada ejecución. Esto es lo que he intentado:Programación de llamadas a una tasa fija

La tarea

class ScheduledWork implements Callable<String> 
{ 
    public String call() 
    { 
     //do the task and return the result as a String 
    } 
} 

No he tratado de usar la ScheduledExecutorService a lo programado. Resulta que no puede programar un Callable a una tasa fija, solo se puede hacer un Runnable.

Por favor, asesorar.

+0

o ... En lugar de esperar a que el valor de retorno de la que se puede llamar, por qué no manejar en ella? De modo que tendrías un Runnable en lugar de tu Callable y en el Runnable, una vez que tengas el valor con el que quieres actuar, simplemente úsalo y haz lo que quieras. –

Respuesta

8

Utilice un producer/consumer pattern: tenga el Runnable put su resultado en un BlockingQueue. Tener otro hilo take() de la cola.

Take es una llamada de bloqueo (es decir, solo se devuelve cuando hay algo en la cola), por lo que obtendrá los resultados tan pronto como estén disponibles.

Puede combinar esto con hollywood pattern para proporcionar el hilo de espera con una devolución de llamada para que se llame su código cuando hay algo disponible.

-1

A menos que, si no le importe el valor de retorno de su Callable, puede envolverlo en Runnable y usarlo para pasar al ScheduledExecutorService.

public static Runnable runnableOf(final Callable<?> callable) 
{ 
    return new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       callable.call(); 
      } 
      catch (Exception e) 
      { 
      } 
     } 
    }; 
} 

Luego, cuando se desea someter a ScheduledExecutroService puede pasar su Callable:

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit); 
Cuestiones relacionadas