2011-09-07 6 views
8

Ho un'attività che voglio eseguire a una velocità fissa. Tuttavia, ho bisogno anche del risultato dell'attività dopo ogni esecuzione. Ecco quello che ho provato:Pianificazione di una richiamata a una tariffa fissa

Il compito

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

No ho cercato di usare il ScheduledExecutorService per programmato esso. Risulta che non è possibile pianificare un Callable a una velocità fissa, solo un Runnable può essere fatto così.

Si prega di avvisare.

+0

o ... Invece di aspettare che il valore di ritorno del Callable, perché non gestire in esso? Quindi avresti un Runnable al posto del tuo Callable e nel Runnable, una volta ottenuto il valore su cui vuoi agire, basta usarlo e fare ciò che vuoi. –

risposta

8

Utilizzare un producer/consumer pattern: avere il Runnable put il risultato su un BlockingQueue. Avere un'altra discussione take() dalla coda.

Take è una chiamata bloccante (ovvero restituisce solo quando qualcosa è in coda), quindi otterrai i risultati non appena disponibili.

È possibile combinare questo con lo hollywood pattern per fornire il thread in attesa con una richiamata in modo che il codice venga chiamato quando qualcosa è disponibile.

-1

A meno che non si tenga a cuore il valore di ritorno del proprio Callable, è possibile avvolgerlo in un Runnable e utilizzarlo per passare a ScheduledExecutorService.

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

Poi, quando si desidera inviare a ScheduledExecutroService è possibile passare il vostro Callable:

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit); 
Problemi correlati