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.

È stato utile?

Soluzione

Utilizza un pattern produttore / consumatore : fai in modo che Runnable metti il suo risultato su BlockingQueue .Avere un altro thread prendere () dalla coda.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top