Pianificazione di una chiamata a un tasso fisso
-
27-10-2019 - |
Domanda
Ho un'attività che voglio eseguire a una velocità fissa.Tuttavia, ho anche bisogno del risultato dell'attività dopo ogni esecuzione.Ecco cosa ho provato:
Il compito
class ScheduledWork implements Callable<String>
{
public String call()
{
//do the task and return the result as a String
}
}
No, ho provato a utilizzare ScheduledExecutorService
per pianificarlo.Risulta che non puoi programmare un Callable
a una tariffa fissa, solo un Runnable
può essere fatto così.
Si prega di avvisare.
Soluzione
Utilizza un pattern produttore / consumatore : fai in modo che Runnable metti il suo risultato su
Take è una chiamata di blocco (ovvero restituisce solo quando qualcosa è in coda), quindi otterrai i risultati non appena saranno disponibili.
Potresti combinare questo con il modello hollywoodiano per fornire al thread in attesa una richiamata in modo che il tuoil codice viene chiamato quando qualcosa è disponibile.
Altri suggerimenti
A meno che non ti interessi il valore di ritorno del tuo Callable
, puoi racchiuderlo in un Runnable
e usarlo per passare a ScheduledExecutorService
.
public static Runnable runnableOf(final Callable<?> callable)
{
return new Runnable()
{
public void run()
{
try
{
callable.call();
}
catch (Exception e)
{
}
}
};
}
Quindi, quando si desidera inviare a ScheduledExecutroService
, è possibile passare il proprio Callable
:
ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit);